返回JavaScript中修改过的对象(类似于镜头)
与函数式语言中的Lens类似,JavaScript中是否有方法返回与原始对象相同的新对象,但某些元素已被修改返回JavaScript中修改过的对象(类似于镜头),javascript,ecmascript-6,destructuring,Javascript,Ecmascript 6,Destructuring,与函数式语言中的Lens类似,JavaScript中是否有方法返回与原始对象相同的新对象,但某些元素已被修改 var myObject = { label: 'Table', options: ['legs'], params: { colour: 'red', feet: { colour: 'white', shape: 'round' } } } function newObject(obj) { // sought-a
var myObject = {
label: 'Table',
options: ['legs'],
params: {
colour: 'red',
feet: {
colour: 'white',
shape: 'round'
}
}
}
function newObject(obj) {
// sought-after syntax here
return obj({ params.colour = 'green', params.feet.shape = 'square' })
}
console.log(newObject(myObject))
{
label: 'Table',
options: ['legs'],
params: {
colour: 'green',
feet: {
colour: 'white',
shape: 'square'
}
}
}
注意:
newObject()
返回一个新对象,不会影响任何形状或形式的原始对象。不使用对象即可轻松完成嵌套。分配:
Object.assign({}, obj, { label: "New One" })
或使用对象展开:
{ ...obj, label: "New One" }
要支持嵌套对象/数组,必须手动递归合并对象:
function merge(target, changes) {
const result = {};
for(const [key, value] of Object.entries(target).concat(Object.entries(changes))) {
if(Array.isArray(value)) {
// TODO
} else if(typeof value === "object") {
result[key] = merge(result[key] || {}, value);
} else {
result[key] = value;
}
}
return result;
}
您可以尝试使用扩展语法
var myObject={
标签:'表',
选项:[“腿”],
参数:{
颜色:“红色”,
脚:{
颜色:'白色',
形状:“圆形”
}
}
}
函数newObject(obj){
//这里流行的语法
返回({…obj,params:{…obj.params,颜色:“绿色”,英尺:{…obj.params.feet,形状:“正方形”}})
}
console.log(newObject(myObject))
另一种方法是:
let newObj = JSON.parse(JSON.stringify(oldObj))
它是一个普通的物体还是一个复杂的物体?另外,它是否有任何分配给它的函数,或者它只是原语、数组和其他对象?JavaScript中没有对其的直接支持,但它当然可以实现代码来完成类似的事情。这将是一个仅由原语组成的对象,数组和其他对象Scheck immer或ramda或immutableJavaScript的功能足够强大,您可以编写自己的lents+1以使用扩展语法。作为旁注,当使用大量参数时,这种方法有一个警告,可能会达到Javascript引擎的限制(这看起来取决于实现,所以从大约10000个参数到65535个参数)。看到了,感觉就像是原生镜片对我的支持