我有一个像这样的数组:
[
32545343: {
data: [{id: 1}, {id: 2}]
},
547347: {
data: [{id: 1}, {id: 4}]
},
95757: {
data: [{id: 1}, {id: 6}]
},
]
如何将所有数据数组合并到一个数组中,而不复制具有相同 id 的对象,如下所示:
[{id: 1}, {id: 2}, {id: 4}, {id: 6}]
Set
结构的解决方案
var d = { 32545343: { data: [{ id: 1 }, { id: 2 }] }, 547347: { data: [{ id: 1 }, { id: 4 }] }, 95757: { data: [{ id: 1 }, { id: 6 }] }, };
var set = new Set();
Object.keys(d).forEach(a =>
d[a].data.forEach(b => set.add(JSON.stringify(b))));
document.write(Array.from(set));
假设您有一个对象,那么此解决方案将使用临时对象来收集相同的对象。
var data = { 32545343: { data: [{ id: 1 }, { id: 2 }] }, 547347: { data: [{ id: 1 }, { id: 4 }] }, 95757: { data: [{ id: 1 }, { id: 6 }] } },
result = function (object) {
var r = [];
Object.keys(object).forEach(function (k) {
object[k].data.forEach(function (a) {
if (!this[a.id]) {
this[a.id] = a;
r.push(a);
}
}, this);
}, {});
return r;
}(data);
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
问题不正确,不能像地图一样定义数组:[ x: 1, y:1 ],正确的定义:
var a = {
32545343: {
data: [{id: 1}, {id: 2}]
},
547347: {
data: [{id: 1}, {id: 4}]
},
95757: {
data: [{id: 1}, {id: 6}]
}
};
一种解决方案是使用平面图(一种实现在这里:https://gist.github.com/samgiles/762ee337dff48623e729)
Array.prototype.flatMap = function(lambda) {
return Array.prototype.concat.apply([], this.map(lambda));
};
然后你可以转换(不要忘记 a 不是数组,它是一个对象!)
var b = Object.keys(a).flatMap(function(key) { return a[key].data; });
// than you can distinct the list:
var result = b.filter(function(element, index, arr) { return arr.slice(index+1).filter(function(e) { return e.id === element.id }).length===0; });
console.log(result);
您可以采用一种函数式方法,从每个对象的数据数组创建的展平数组中挑选出唯一的对象。
function flatten(arr) {
return arr.reduce(function (p, c) {
return p.concat(c);
}, []);
}
function pluck(obj, key) {
return Object.keys(obj).map(function (el) {
return obj[el][key];
});
}
function unique(arr, key) {
var ids = [];
return arr.filter(function (el) {
if (ids.indexOf(el[key]) === -1) {
ids.push(el[key]);
return true;
}
});
}
var result = unique(flatten(pluck(obj, 'data')), 'id');