用数组连接 2 个对象并删除重复项 (js)
concat 2 objects with arrays and delete duplicates (js)
有 2 个数组:看起来像这样
1) 第一个数组
{day:mo, hours:[{id:1,color:grey},{id:2,color:grey},{id:3,color:grey},{id:4,color:grey}]}
2) 第二个数组
{day:mo, hours:[{id:1,color:white},{id:2,color:white},{id:3,color:white},{id:4,color:white},{id:5,color:white}]}
结果必须是
{day:mo, hours:[{id:1,color:grey},{id:2,color:grey},{id:3,color:grey},{id:4,color:grey},{id:5,color:white}]}
所以我需要先从 2 个数组中删除相同的值,然后再连接它。
尝试这样做
clearArrFunc(arr1,arr2) {
// do something
for(var i in arr1){
console.log(arr1[i]);
for(var j in arr2) {
if(JSON.stringify(arr1[i].day) == JSON.stringify(arr2[j].day)) {
delete arr2[j] ;
}
}
}
// console.log(arr2);
return arr1.concat(arr2);
}
连接两个数组,然后从结果中消除重复的 ID:
a = [{id:1,color:'grey'},{id:2,color:'grey'},{id:3,color:'grey'},{id:4,color:'grey'}]
b = [{id:1,color:'white'},{id:2,color:'white'},{id:3,color:'white'},{id:4,color:'white'},{id:5,color:'white'}]
result = a
.concat(b)
.filter((x, i, self) => self.findIndex(y => y.id === x.id) === i);
console.log(result)
一个不那么简洁但更有效的选择是从第一个数组构建一组 id,然后只追加第二个 id 不在集合中的元素:
a = [{id:1,color:'grey'},{id:2,color:'grey'},{id:3,color:'grey'},{id:4,color:'grey'}]
b = [{id:1,color:'white'},{id:2,color:'white'},{id:3,color:'white'},{id:4,color:'white'},{id:5,color:'white'}]
ids = new Set(a.map(x => x.id))
result = a.concat(b.filter(x => !ids.has(x.id)))
console.log(result)
另一种方法,从第二个数组中删除第一个数组中存在的那些值,并将结果与第一个数组连接。
var x = [{id:1,color:'grey'},{id:2,color:'grey'},{id:3,color:'grey'},{id:4,color:'grey'}];
var y = [{id:1,color:'white'},{id:2,color:'white'},{id:3,color:'white'},{id:4,color:'white'},{id:5,color:'white'}];
var r = x.concat(y.filter(function(obj) {
return !x.some(function(o) {
return o.id===obj.id;
});
}));
console.log(r);
使用 Lodash (https://lodash.com)
const _ = require('lodash');
const a = [{id: 1, color: "grey"},{id: 2, color: "grey"},{id: 3, color: "grey"},{id: 4, color: "grey"}];
const b = [{id: 1, color: "white"},{id: 2, color: "white"},{id: 3, color: "white"},{id: 4, color: "white"},{id: 5, color: "white" }];
const result = _.unionBy(o1.hours, o2.hours), 'id');
// result = [{id: 1, color: "grey"}, {id: 2, color: "grey"}, {id: 3, color: "grey"}, {id: 4, color: "grey"}, {id: 5, color: "white"}]
有 2 个数组:看起来像这样
1) 第一个数组
{day:mo, hours:[{id:1,color:grey},{id:2,color:grey},{id:3,color:grey},{id:4,color:grey}]}
2) 第二个数组
{day:mo, hours:[{id:1,color:white},{id:2,color:white},{id:3,color:white},{id:4,color:white},{id:5,color:white}]}
结果必须是
{day:mo, hours:[{id:1,color:grey},{id:2,color:grey},{id:3,color:grey},{id:4,color:grey},{id:5,color:white}]}
所以我需要先从 2 个数组中删除相同的值,然后再连接它。
尝试这样做
clearArrFunc(arr1,arr2) {
// do something
for(var i in arr1){
console.log(arr1[i]);
for(var j in arr2) {
if(JSON.stringify(arr1[i].day) == JSON.stringify(arr2[j].day)) {
delete arr2[j] ;
}
}
}
// console.log(arr2);
return arr1.concat(arr2);
}
连接两个数组,然后从结果中消除重复的 ID:
a = [{id:1,color:'grey'},{id:2,color:'grey'},{id:3,color:'grey'},{id:4,color:'grey'}]
b = [{id:1,color:'white'},{id:2,color:'white'},{id:3,color:'white'},{id:4,color:'white'},{id:5,color:'white'}]
result = a
.concat(b)
.filter((x, i, self) => self.findIndex(y => y.id === x.id) === i);
console.log(result)
一个不那么简洁但更有效的选择是从第一个数组构建一组 id,然后只追加第二个 id 不在集合中的元素:
a = [{id:1,color:'grey'},{id:2,color:'grey'},{id:3,color:'grey'},{id:4,color:'grey'}]
b = [{id:1,color:'white'},{id:2,color:'white'},{id:3,color:'white'},{id:4,color:'white'},{id:5,color:'white'}]
ids = new Set(a.map(x => x.id))
result = a.concat(b.filter(x => !ids.has(x.id)))
console.log(result)
另一种方法,从第二个数组中删除第一个数组中存在的那些值,并将结果与第一个数组连接。
var x = [{id:1,color:'grey'},{id:2,color:'grey'},{id:3,color:'grey'},{id:4,color:'grey'}];
var y = [{id:1,color:'white'},{id:2,color:'white'},{id:3,color:'white'},{id:4,color:'white'},{id:5,color:'white'}];
var r = x.concat(y.filter(function(obj) {
return !x.some(function(o) {
return o.id===obj.id;
});
}));
console.log(r);
使用 Lodash (https://lodash.com)
const _ = require('lodash');
const a = [{id: 1, color: "grey"},{id: 2, color: "grey"},{id: 3, color: "grey"},{id: 4, color: "grey"}];
const b = [{id: 1, color: "white"},{id: 2, color: "white"},{id: 3, color: "white"},{id: 4, color: "white"},{id: 5, color: "white" }];
const result = _.unionBy(o1.hours, o2.hours), 'id');
// result = [{id: 1, color: "grey"}, {id: 2, color: "grey"}, {id: 3, color: "grey"}, {id: 4, color: "grey"}, {id: 5, color: "white"}]