如何在javascript中按ID合并多个对象数组?

IT技术 javascript arrays lodash
2021-03-06 20:09:54

我想将 4 个对象数组合并为一个数组

例如: 4个数组像

var arr1 =[
  { memberID : "81fs", RatingCW:4.5},
  { memberID : "80fs", RatingCW:4},
  { memberID : "82fs", RatingCW:5 },
  { memberID : "83fs", RatingCW:3},
  { memberID : "84fs", RatingCW:4.7}
];
var arr2 =[
  { memberID : "80fs", ratingWW: 4},
  { memberID : "81fs", ratingWW: 4.5},
  { memberID : "83fs", ratingWW: 3},
  { memberID : "82fs", ratingWW: 5},
  { memberID : "84fs", ratingWW: 3.5}
];

var arr3 =  [
  { memberID : "80fs", incoCW:4},
  { memberID : "81fs", incoCW:4.5},
  { memberID : "82fs", incoCW:5},
  { memberID : "83fs", incoCW:3},
  { memberID : "84fs", incoCW:4.5}
  ];
var arr4 =  [
  { memberID : "80fs", incoWW:3},
  { memberID : "81fs", incoWW:2.5 },
  { memberID : "82fs", incoWW:5 },
  { memberID : "83fs", incoWW:3 },
  { memberID : "84fs", incoWW:6.5 }
];

预期的数组,如:

var finalArr = [
    { memberID : "80fs", RatingCW:4,ratingWW: 4, incoCW:4, incoWW:3},
    { memberID : "81fs", RatingCW:4.5,ratingWW: 4.5, incoCW:4.5, incoWW:2.5 },
    { memberID : "82fs", RatingCW:5,ratingWW: 5, incoCW:5, incoWW:5 },
    { memberID : "83fs", RatingCW:3,ratingWW: 3, incoCW:3, incoWW:3 },
    { memberID : "84fs", RatingCW:4.7,ratingWW: 3.5, incoCW:4.5, incoWW:6.5 }
  ];

使用 lodash 或普通 javascript 合并的最佳方法是什么?

5个回答

使用 lodash,我认为更具可读性。

var arr1 = [{"memberID":"81fs","RatingCW":4.5},{"memberID":"80fs","RatingCW":4},{"memberID":"82fs","RatingCW":5},{"memberID":"83fs","RatingCW":3},{"memberID":"84fs","RatingCW":4.7}],
    arr2 = [{"memberID":"80fs","ratingWW":4},{"memberID":"81fs","ratingWW":4.5},{"memberID":"83fs","ratingWW":3},{"memberID":"82fs","ratingWW":5},{"memberID":"84fs","ratingWW":3.5}],
    arr3 = [{"memberID":"80fs","incoCW":4},{"memberID":"81fs","incoCW":4.5},{"memberID":"82fs","incoCW":5},{"memberID":"83fs","incoCW":3},{"memberID":"84fs","incoCW":4.5}],
    arr4 = [{"memberID":"80fs","incoWW":3},{"memberID":"81fs","incoWW":2.5},{"memberID":"82fs","incoWW":5},{"memberID":"83fs","incoWW":3},{"memberID":"84fs","incoWW":6.5}];

var merged = _(arr1)
  .concat(arr2, arr3, arr4)
  .groupBy("memberID")
  .map(_.spread(_.merge))
  .value();

console.log(merged);
<script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"></script>

这是代码笔:http ://codepen.io/kuhnroyal/pen/Wxzdmw

就做.concat(arr2, arr3, arr4)此外,.groupBy('memberID')是该分组功能的简写。
2021-04-16 20:09:54
您可以使用_.spread()例如map(_.spread(_.merge))
2021-04-18 20:09:54
有一个非常相似的问题,如果不是这个解决方案,就会出现双循环。美丽 - 谢谢分享。
2021-04-23 20:09:54
你能提供一个等效的使用_.flow吗?
2021-04-24 20:09:54
有没有人碰巧知道这是否会维持特定的秩序?
2021-05-12 20:09:54

以下是使用 lodash 的一些步骤:

  1. 将所有对象放入一个数组中(_.flatten 然后是 _.groupby)
  2. 将二维数组展平为“用户”obj 的一维数组(_.map 然后 _.merge 并应用于将数组作为 arg 传入)

var arr1 =[
  { memberID : "81fs", RatingCW:4.5},
  { memberID : "80fs", RatingCW:4},
  { memberID : "82fs", RatingCW:5 },
  { memberID : "83fs", RatingCW:3},
  { memberID : "84fs", RatingCW:4.7}
];
var arr2 =[
  { memberID : "80fs", ratingWW: 4},
  { memberID : "81fs", ratingWW: 4.5},
  { memberID : "83fs", ratingWW: 3},
  { memberID : "82fs", ratingWW: 5},
  { memberID : "84fs", ratingWW: 3.5}
];

var arr3 =  [
  { memberID : "80fs", incoCW:4},
  { memberID : "81fs", incoCW:4.5},
  { memberID : "82fs", incoCW:5},
  { memberID : "83fs", incoCW:3},
  { memberID : "84fs", incoCW:4.5}
  ];
var arr4 =  [
  { memberID : "80fs", incoWW:3},
  { memberID : "81fs", incoWW:2.5 },
  { memberID : "82fs", incoWW:5 },
  { memberID : "83fs", incoWW:3 },
  { memberID : "84fs", incoWW:6.5 }
];

var a  = _.groupBy(_.flatten([arr1,arr2,arr3,arr4]), 'memberID');
var b = _.map(a, function(val){ return _.merge.apply(_,val) });    
console.log(b);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.2.1/lodash.min.js"></script>

纯 JS 方式,这是一个艰难的方式,需要几个小时才能得到它。

var arr1 = [{"memberID":"81fs","RatingCW":4.5},{"memberID":"80fs","RatingCW":4},{"memberID":"82fs","RatingCW":5},{"memberID":"83fs","RatingCW":3},{"memberID":"84fs","RatingCW":4.7}],
    arr2 = [{"memberID":"80fs","ratingWW":4},{"memberID":"81fs","ratingWW":4.5},{"memberID":"83fs","ratingWW":3},{"memberID":"82fs","ratingWW":5},{"memberID":"84fs","ratingWW":3.5}],
    arr3 = [{"memberID":"80fs","incoCW":4},{"memberID":"81fs","incoCW":4.5},{"memberID":"82fs","incoCW":5},{"memberID":"83fs","incoCW":3},{"memberID":"84fs","incoCW":4.5}],
    arr4 = [{"memberID":"80fs","incoWW":3},{"memberID":"81fs","incoWW":2.5},{"memberID":"82fs","incoWW":5},{"memberID":"83fs","incoWW":3},{"memberID":"84fs","incoWW":6.5}];

const arrs=[...arr1,...arr2,...arr3,...arr4];
const noDuplicate=arr=>[...new Set(arr)]
const allIds=arrs.map(ele=>ele.memberID);
const ids=noDuplicate(allIds);

const result=ids.map(id=>
	arrs.reduce((self,item)=>{
		return item.memberID===id?
		{...self,...item} : self
	},{})
)
console.log(result);

arr1.map(a =>
    Object.assign({},a,
        arr2.find(b => b.memberID === a.memberID),
        arr3.find(c => c.memberID === a.memberID),
        arr4.find(d => d.memberID === a.memberID)
    )
)

这是最简单的代码......这基本上是一个oneliner解决方案。性能可能不是最好的,但适用于小数据集。

很酷的东西,你能提供更多关于这在性能上有多糟糕的信息吗?
2021-05-06 20:09:54

您可以使用哈希表来正确引用结果数组。

由于memberID对象中的引用我也使用未排序的数组

 var arr1 = [{ memberID: "80fs", RatingCW: 4 }, { memberID: "81fs", RatingCW: 4.5 }, { memberID: "82fs", RatingCW: 5 }, { memberID: "83fs", RatingCW: 3 }, { memberID: "84fs", RatingCW: 4.7 }],
    arr2 = [{ memberID: "80fs", ratingWW: 4 }, { memberID: "81fs", ratingWW: 4.5 }, { memberID: "82fs", ratingWW: 5 }, { memberID: "83fs", ratingWW: 3 }, { memberID: "84fs", ratingWW: 3.5 }],
    arr3 = [{ memberID: "80fs", incoCW: 4 }, { memberID: "81fs", incoCW: 4.5 }, { memberID: "82fs", incoCW: 5 }, { memberID: "83fs", incoCW: 3 }, { memberID: "84fs", incoCW: 4.5 }],
    arr4 = [{ memberID: "80fs", incoWW: 3 }, { memberID: "81fs", incoWW: 2.5 }, { memberID: "82fs", incoWW: 5 }, { memberID: "83fs", incoWW: 3 }, { memberID: "84fs", incoWW: 6.5 }],
    merged = [];

[arr1, arr2, arr3, arr4].forEach(function (a) {
    a.forEach(function (b) {
        if (!this[b.memberID]) {
            this[b.memberID] = {};
            merged.push(this[b.memberID]);
        }
        Object.keys(b).forEach(function (k) {
            this[b.memberID][k] = b[k];
        }, this);
    }, this);
}, Object.create(null));

console.log(merged);

ES6 用于未排序的数据。

 var arr1 = [{ memberID: "80fs", RatingCW: 4 }, { memberID: "81fs", RatingCW: 4.5 }, { memberID: "82fs", RatingCW: 5 }, { memberID: "83fs", RatingCW: 3 }, { memberID: "84fs", RatingCW: 4.7 }],
    arr2 = [{ memberID: "80fs", ratingWW: 4 }, { memberID: "81fs", ratingWW: 4.5 }, { memberID: "82fs", ratingWW: 5 }, { memberID: "83fs", ratingWW: 3 }, { memberID: "84fs", ratingWW: 3.5 }],
    arr3 = [{ memberID: "80fs", incoCW: 4 }, { memberID: "81fs", incoCW: 4.5 }, { memberID: "82fs", incoCW: 5 }, { memberID: "83fs", incoCW: 3 }, { memberID: "84fs", incoCW: 4.5 }],
    arr4 = [{ memberID: "80fs", incoWW: 3 }, { memberID: "81fs", incoWW: 2.5 }, { memberID: "82fs", incoWW: 5 }, { memberID: "83fs", incoWW: 3 }, { memberID: "84fs", incoWW: 6.5 }],
    merged = [];

[arr1, arr2, arr3, arr4].forEach((hash => a => a.forEach(b => {
    if (!hash[b.memberID]) {
        hash[b.memberID] = {};
        merged.push(hash[b.memberID]);
    }
    Object.assign(hash[b.memberID], b);
}))(Object.create(null)));


console.log(merged);