Javascript ReactJS:Immutable.js:合并两个Json对象

Javascript ReactJS:Immutable.js:合并两个Json对象,javascript,reactjs,immutable.js,Javascript,Reactjs,Immutable.js,我正在使用React、Redux和immutable。我尝试合并两个Json对象,数据和预期结果如下所示 obj1 = {id: 1, first_name: "abc", surname: "def", children: ["kid1", "kid2"]} obj2 = {first_name: "abc", surname: "def", email: "abc.def@gmail.com", mobile: ""} mergedObj = {id: 1, first_name:

我正在使用React、Redux和immutable。我尝试合并两个Json对象,数据和预期结果如下所示

obj1 = 
{id: 1, first_name: "abc", surname: "def", children: ["kid1", "kid2"]}

obj2 = 
{first_name: "abc", surname: "def", email: "abc.def@gmail.com", mobile: ""}

mergedObj = {id: 1, first_name: "abc", surname: "def", email: "abc.def@gmail.com", Mobile: "",  children: ["kid1", "kid2"]}
如果obj1上没有数据,则应从obj2获取数据

我尝试使用不可变合并,如下所述

import Immutable, {merge} from "immutable";
const mergedObj = merge(Immutable.fromJS(obj2), Immutable.fromJS(obj1));
console.log(mergedObj)
结果与obj2相同,本质上,合并没有发生

{first_name: "abc", surname: "def", email: "abc.def@gmail.com", mobile: ""}

您可以使用javascript扩展操作符进行合并,这是ES6之后引入的

var obj1 = {id: 1, first_name: "abc", surname: "def", children: ["kid1", "kid2"]}

var obj2 = {first_name: "abc", surname: "def", email: "abc.def@gmail.com", mobile: ""}

var mergedObj = {...obj1,...obj2};

这些文档似乎表明您正确使用了immutable.merge()。

可悲的是,这一功能似乎已被破坏,正如人们在电视上看到的那样

我建议提交一个发行/赎回请求来解决这个问题,但看起来——回购协议有26个开放式赎回请求,上个月没有合并


无论如何,我要说的是,使用ES6+JS就可以了。Immutable在这之前是一种必备品,因为JS没有为这种模式提供足够的现成工具

如果这是一个选项(或者即使不是,以下将按预期的方式工作),请考虑AlwinJose建议使用ESE2018:


(执行浅层合并,就像)

如果您从POJO开始并希望以POJO结束,我建议使用如上所述的对象扩展语法(或
object.assign
)。在这种情况下,没有必要使用Immutable

如果您想使用Immutable,并且您知道
obj1
obj2
是对象,那么可以调用
Map(obj2)。而不是merge(obj1)
,这肯定是有效的。(基于我们的代码库中的广泛使用。)

否则,文档声称您可以使用POJO调用
Immutable.merge
,因此使用
Immutable.merge(obj2,obj1)
,您可能会更幸运,省去了对
Immutable.fromJS

示例数据的调用=

        const json1 = [
            {id: 1, test: 1},
            {id: 2, test: 2},
            {id: 3, test: 3},
            {id: 4, test: 4},
            {id: 5, test: 5}
        ];

        const json2 = [
            {id: 3, test: 6},
            {id: 4, test: 7},
            {id: 5, test: 8},
            {id: 6, test: 9},
            {id: 7, test: 10}
        ];
例1=


        const finalData1 = json1.concat(json2).reduce(function (index, obj) {
            index[obj.id] = Object.assign({}, obj, index[obj.id]);
            return index;
        }, []).filter(function (res, obj) {
            return obj;
        });
例2=

        let hashData = new Map();

        json1.concat(json2).forEach(function (obj) {
            hashData.set(obj.id, Object.assign(hashData.get(obj.id) || {}, obj))
        });

        const finalData2 = Array.from(hashData.values());

我推荐第二个例子,它更快。

为了学究的缘故,这里有关扩展运算符的更多信息,ES2018中引入了对象文字的扩展运算符(因此在ES6中不可用)。您正在合并两个普通对象(也称为POJO)。“JSON”是指这些内容的字符串表示形式。(抱歉,这是本页第二次迂腐了)。不管怎么说,我对这个问题的明确性和合法性投了赞成票。雨果,谢谢你的回答。我将提出一个问题。目前,我将继续使用ES6解决方案*cough*ES2018*cough*它不太可能在短期内得到修复,但如果您想提出问题,请继续:)至少会记录下来
        let hashData = new Map();

        json1.concat(json2).forEach(function (obj) {
            hashData.set(obj.id, Object.assign(hashData.get(obj.id) || {}, obj))
        });

        const finalData2 = Array.from(hashData.values());