2016-09-27 71 views
-1

是否有一个原生JavaScript函数(或用于JavaScript的库/模块)可以修改某个键的值并返回完整对象?是否存在修改对象属性的“本地”Javascript函数

这里是我做了什么:

function modifyJSON(jsob, key, val) { 
    var newjsob = JSON.parse(JSON.stringify(jsob)); 
    newjsob[key] = val; 
    return newjsob; 
} 

(当然,如果我想修改原来的,我可以删除var newjsob...与jsob直接合作。)

这工作,但如果这种类型的功能已经在某个地方实现了,我宁愿使用它,而不是自己推出。

+2

这是关于Javascript对象,与JSON无关。 JSON是一种将对象和数组表示为字符串的方式。 – Barmar

+0

替换该值很容易(如您所见,'x [key] = y')。棘手的部分是克隆对象,大多数地方使用[结构化克隆算法](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm)。如果你可以自己运行它,那么你将拥有一个比JSON更加强大的不错的副本。 – ssube

+0

没有原生功能。图书馆:也许,但这是无关紧要的。 –

回答

1

你的标题是有点误导。你正在做的是深入克隆现有对象,然后更改新对象的属性。

如果浅表复制是不够的,你可以使用Object.assign:

var update = {}; 
update[key] = val; 
return Object.assign(jsob, update); 

如果你需要深克隆,我想看看ImmutableJS。更新不可变数据结构上的任何字段时,将返回应用了更新的原始结构的克隆。这几乎是你写的确切行为。

1

基本上,困难的部分是深层次的克隆。 Lodash可以为你深入克隆物体。

https://lodash.com/docs/4.16.2#cloneDeep

function modifyJSON(jsob, key, val) { 
    var newjsob = _.cloneDeep(jsob); 
    newjsob[key] = val; 
    return newjsob 
} 

后你会得到新的对象,你可以修改对象的属性,你的愿望。

但是,请注意深度复制较慢。只有你必须使用它。

https://jsfiddle.net/38kscyxa/

相关问题