Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在忽略嵌套数组的情况下深度合并两个不可变映射_Javascript_Immutable.js - Fatal编程技术网

Javascript 在忽略嵌套数组的情况下深度合并两个不可变映射

Javascript 在忽略嵌套数组的情况下深度合并两个不可变映射,javascript,immutable.js,Javascript,Immutable.js,const map1=Immutable.Map({a:{x:1,z:1,y:1,value:[1,2,3]}); const map2=Immutable.Map({a:{x:2,值:[4,5,6]}); 常量map3=map1.mergeDeep(map2) //我想要的输出是: //{a:{x:2,z:1,y:1值:[4,5,6]}这个问题似乎与stackoverflow post有关。如文中所述,使用“代替”可获得所需的结果。此外,这个答案很好地解释了两者之间的区别。请参考并运行下面的代

const map1=Immutable.Map({a:{x:1,z:1,y:1,value:[1,2,3]});
const map2=Immutable.Map({a:{x:2,值:[4,5,6]});
常量map3=map1.mergeDeep(map2)
//我想要的输出是:

//{a:{x:2,z:1,y:1值:[4,5,6]}
这个问题似乎与stackoverflow post有关。如文中所述,使用“代替”可获得所需的结果。此外,这个答案很好地解释了两者之间的区别。请参考并运行下面的代码段以了解工作示例:

const map1=Immutable.fromJS({a:{x:1,z:1,y:1,value:[1,2,3]});
const map2=Immutable.fromJS({a:{x:2,值:[4,5,6]});
常量map3=map1.mergeDeep(map2)
console.log(map3)
//我想要的输出是:
//{a:{x:2,z:1,y:1值:[4,5,6]}
/*这个片段的结果是:
{
“a”:{
“x”:2,
“z”:1,
“y”:1,
“价值观”:[
4.
5.
6.
]
}
}
*/

您没有说明所使用的immutable.js版本,但按照您的要求,它可能是4.0.0-rc12。Immutable.js 3.8.x版的mergeDeep函数满足了您的需求;它替换了数组,而不是合并它们。这就是为什么@etarhan的答案对你有效,但对你无效

没有“好”的解决方案。函数让您定义合并函数,但遗憾的是合并只在冲突时触发-因此它也没有帮助您。您所能做的就是手动遍历对象或升级immutable.js

还要注意,
Immutable.Map({a:{x:1,z:1,y:1,value:[1,2,3]})只对输入进行浅转换。
值的数组保持为数组。这通常是不希望的,您可能希望有一个不可变的.List而不是数组。为此,请使用
fromJS
,它将depply转换为

我会在slack channel上提出这个问题,我认为也有可能在collections上进行合并

类似于此的东西可能会起作用:
const map1=Immutable.fromJS({a:{x:'one',z:'old',y:'old',value:[1,2,3]});
const map2=Immutable.fromJS({a:{x:'two',v:'new',value:[4,5,6]});
函数mergeStuff(a,b,path=''){
返回a.with突变(map=>{
用于(b.keys()中的键){
地图更新(键,(val)=>{
log('更新',路径+键,val,b.get(键));
if(不可变。isKeyed(val)){
返回mergeStuff(val,b.get(key),key+');
}
返回b.get(key,val);
});
}
});
}
const map3=mergeStuff(map1,map2);
log('result:');
console.log(map3)

如果运行此命令,您将看到值的长度为6,我希望数组替换为[4,5,6],而不是merged@GregM我很困惑,如果你运行代码段,你会得到这样的结果,值数组被[4,5,6]替换。您正在使用其他版本的immutable吗?