是否有更短的方法来合并重复的对象
Is there a shorter way to merge duplicated objects
我很好奇是否有更短的方法来完成这一点?
通过匹配某些属性来检查是否有重复的数组,然后将重复的数组压入。Items
var array = [
{type: "Fruit", something: "abc", more: "properties", items: [{word:"Apple", abc: "ok"}]},
{type: "Fruit", something: "abc", more: "properties", items: [{word:"Orange", abc: "ok"}]}
];
merge(array)将变成
array = [
{type: "Fruit", something: "abc", more: "properties", items:[{word:"Apple", abc: "ok"}, {word:"Orange", abc: "ok"}]}
];
merge: function(arr) {
var rec, dupeIndices, foundDupes;
for (var idx = 0, len = arr.length; idx < len - 1; ++idx) {
rec = arr[idx];
if (rec === null) continue;
dupeIndices = findDupeIndices(rec, arr.slice(idx + 1), idx + 1);
if (dupeIndices.length === 0) continue;
foundDupes = true;
processDupes(rec, dupeIndices, arr);
}
if (foundDupes) cleanUp(arr);
},
cleanUp: function(arr) {
for (var idx = 0; idx < arr.length; ++idx) {
if (arr[idx] === null) arr.splice(idx--, 1);
}
},
processDupes: function(rec, dupeIndices, arr) {
var dupeRealIdx, dupeRec;
for (var dupeIdx = 0, dupesLen = dupeIndices.length; dupeIdx < dupesLen; ++dupeIdx) {
dupeRealIdx = dupeIndices[dupeIdx];
dupeRec = arr[dupeRealIdx];
updateRecord(rec, dupeRec);
arr[dupeRealIdx] = null;
}
},
findDupeIndices: function(rec, arr, offset) {
var other, result = [];
for (var idx = 0, len = arr.length; idx < len; ++idx) {
other = arr[idx];
if (other === null) continue;
if (isDupe(rec, other)) result.push(idx + offset);
}
return result;
},
isDupe: function(a, b) {
return (a.type === b.type && a.something === b.something);
},
updateRecord: function(rec, dupe) {
for (var i = 0; i < dupe.items.length; i++) {
rec.items.push(dupe.items[i]);
}
}
您可以使用对象来帮助排序,这里我对类型进行排序并组合条目
var obj = [
{type: "Fruit", something: "abc", more: "properties", items: [{word:"Apple", abc: "ok"}]},
{type: "Fruit", something: "abc", more: "properties", items: [{word:"Orange", abc: "ok"}]}
];
var sorted = {};
obj.forEach(function(element){
if(sorted[element.type]){
sorted[element.type].items.push.apply(sorted[element.type].items,element.items)
}else{
sorted[element.type] = {
type: element.type,
something: element.something,
more: element.more,
items:element.items
}
}
});
var sortedarray = Object.keys(sorted).map(function(item){
return sorted[item]});
console.log(sortedarray);
工作示例:http://codepen.io/nilestanner/pen/NAkZbz
是否需要删除重复项?
var arr = [
{type: "Fruit", items:[{word:"Apple"}]},
{type: "Fruit", items:[{word:"Orange"}]}
];
var obj = arr.reduce(function(obj, i) {
obj[i.type] = [].concat(obj[i.type] || [], i.items); return obj;
}, {});
var res = [];
for (var key in obj)
res.push({type: key, items: obj[key]});
// or to unique items
// res.push({type: key, items: obj[key].filter(function (e, i, r) { return r.indexOf(e) == i})});
console.log(res);
相关文章:
- Javascript-根据赋值顺序,按键合并对象数组
- 如何合并对象数组
- 在键值对的唯一组合上合并对象
- Undercore JS嵌套了每个合并对象
- 基于公共属性合并对象数组
- 如何合并对象-lodash
- 扩展/合并对象
- 如何在mongoshell中合并对象
- 在 JavaScript 中合并对象文字/json
- 在Rereduce函数中合并对象的属性会导致每次创建视图时产生错误的值
- 如果对象 id 相同,如何合并对象
- JavaScript 按 id 合并对象
- 从两个数组创建/合并对象哈希映射
- 在 jQuery 中合并对象
- React使用React Immutability Helper或immutable js合并对象的不可变数组
- 如何在属于Reducer的对象内部合并对象特性
- 使用jQuery或underscore.js合并对象中多个数组的值
- 用AngularJS深度合并对象
- jQuery扩展-需要合并对象和数组
- 合并对象&对单个属性javascript求和