可能在这个对象中合并? (JavaScript的)

是否有可能(如果有的话)如何合并具有相同值的标签,以便一个标签有一个所有画廊的数组?

例如,从这开始:

[{ tag: "Kings", galleries: [ "2016 Kings Draft Night" ] }, { tag: "Draft", galleries: [ "2016 Kings Draft Night" ] }, { tag: "Kings", galleries: [ "2016-17 Sacramento Kings Uniforms" ] }] 

并以此结束:

 [{ tag: "Kings", galleries: [ "2016 Kings Draft Night", "2016-17 Sacramento Kings Uniforms" ] }, { tag: "Draft", galleries: [ "2016 Kings Draft Night" ] }] 

任何帮助深表感谢。 难住这个

你可以过滤() concat()现有的tag galleries ,同时删除不必要的。

 var result = data.filter(function(item) { var ref = this[item.tag]; if(!ref) { return (this[item.tag] = item); } ref.galleries = ref.galleries.concat(item.galleries); }, {}); 
 var data = [{ tag: "Kings", galleries: [ "2016 Kings Draft Night" ] }, { tag: "Draft", galleries: [ "2016 Kings Draft Night" ] }, { tag: "Kings", galleries: [ "2016-17 Sacramento Kings Uniforms" ] }]; var result = data.filter(function(item) { var ref = this[item.tag]; if(!ref) { return (this[item.tag] = item); } ref.galleries = ref.galleries.concat(item.galleries); }, {}); document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>'); 

我相信有更快的方法来做到这一点。 但是,这是我想出来的:

 var data = [{ tag: "Kings", galleries: [ "2016 Kings Draft Night" ] }, { tag: "Draft", galleries: [ "2016 Kings Draft Night" ] }, { tag: "Kings", galleries: [ "2016-17 Sacramento Kings Uniforms" ]}] var newData = {}; data.forEach(function(a) { if (!newData[a.tag]) { newData[a.tag] = a.galleries; } else { newData[a.tag] = newData[a.tag].concat(a.galleries); } }); var complete = []; Object.keys(newData).forEach(function(key) { complete.push({ tag: key, galleries: newData[key] }); }); console.log(complete); 

你可以试试这个

 var objA = [{ tag: "Kings", galleries: [ "2016 Kings Draft Night" ] }, { tag: "Draft", galleries: [ "2016 Kings Draft Night" ] }, { tag: "Kings", galleries: [ "2016-17 Sacramento Kings Uniforms" ] }] var result = []; for (var property in objA) { if (objA.hasOwnProperty(property)) { if (result.filter(function(e) { if( e.tag == objA[property].tag) return e.galleries.push(objA[property].galleries[0]) }).length > 0) { } else { result.push(objA[property]); } } } console.log(result); 

plunker: http ://plnkr.co/edit/7AijNY4Tb4DSDaiEQEEB?p=preview

合并function:

 function merge(a){ var r = {},n = []; for(var d in a) r[a[d].tag] = (r[a[d].tag]) ? r[a[d].tag].concat(a[d].galleries) : a[d].galleries; for(var d in r) n.push({'tag':d,'galleries':r[d]}); return(n); } 

还有一个testing:

 a = [{tag: "Kings",galleries: ["2016 Kings Draft Night"]},{tag: "Draft",galleries: ["2016 Kings Draft Night"]},{tag: "Kings",galleries: ["2016-17 Sacramento Kings Uniforms"]}]; console.log(merge(a)); 

你可以使用.filter() .map()rest elementspread element

 var arr = [{ tag: "Kings", galleries: [ "2016 Kings Draft Night" ] }, { tag: "Draft", galleries: [ "2016 Kings Draft Night" ] }, { tag: "Kings", galleries: [ "2016-17 Sacramento Kings Uniforms" ] }]; var filterTags = (a, type) => a.filter(o => o.tag === type) .reduce((curr, next) => { [...curr.galleries] = [...curr.galleries, ...next.galleries]; return curr }); var res = ["Kings", "Draft"].map(val => filterTags(arr, val)); console.log(res); 
 for (var i = 0; i < obj.length-1; i++){ var currTag = obj[i].tag; // get first element for (var j = i + 1; j < obj.length; j++){ // Search for matching tags var newTag = obj[j].tag; if (currTag === newTag){ array1 = obj[i].galleries; // get gallery for prevElement array2 = obj[j].galleries; // get gallery for curr element Array.prototype.push.apply(array1, array2); // merge arrays obj.splice(j,1); // remove the curr array from obj } } }