可能在这个对象中合并? (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 element
, spread 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 } } }