[英]Merging many arrays into one array (JavaScript)
我正在嘗試使用包含許多對象的許多數組的數組,並將其操作為對象數組。
所以,假設我有一個如下所示的數組:
[
[
{Name: 'Josh', email: 'josh@gmail.com', Points: 33},
{Name: 'Doug', email: 'doug@gmail.com', Points: 12}
],
[
{Name: 'Josh', email: 'josh@gmail.com', Points: 11},
{Name: 'Doug', email: 'doug@gmail.com', Points: 18}
],
[
{Name: 'Josh', email: 'josh@gmail.com', Points: 2},
{Name: 'Doug', email: 'doug@gmail.com', Points: 27}
]
]
期望的結果將是一個對象數組,其具有“點”屬性來保存點的數組。 所以它看起來像這樣:
[
{Name: 'Josh', email: 'josh@gmail.com', Points: [33, 11, 2]},
{Name: 'Doug', email: 'doug@gmail.com', Points: [12, 18, 27]}
]
這個問題看起來很簡單,但我似乎無法弄清楚這樣做的最佳方法。 如果你想把這些數據放在一個小提琴里,我就讓你玩這個: http : //jsfiddle.net/Qhxzz/1/
請注意,這取決於輸入結構是靜態的(這里沒有遞歸)。 假設您沒有使用任何庫:
var result = [];
for (var i = 0; i < initial.length; i++) {
var innerArray = initial[i];
for (var j = 0; j < innerArray.length; j++) {
var item = innerArray[j];
var found = false;
// search result for an object with a matching email prop
for (var k = 0; k < result.length; k++) {
if (result[k].email === item.email) {
found = true;
// add this Point to the Points array
result[k].Points.push(item.Points);
}
}
if (!found) {
// convert Points to an array of Points
item.Points = [item.Points];
result.push(item);
}
}
}
下面是使用的一種方式.reduce()
和.forEach()
(如果您支持舊版瀏覽器,則需要修補程序。)
var consolidated = data.reduce(function(holder, arr) {
arr.forEach(function(obj) {
if (obj.email in holder.emails)
holder.emails[obj.email].Points.push(obj.Points);
else {
holder.emails[obj.email] = obj;
holder.result.push(obj);
obj.Points = [obj.Points];
}
});
return holder;
}, {emails:{},result:[]}).result;
實際上,我們可以使用concat.apply()
來展平原始數組,並留下一個單片數組進行迭代。
flat = [].concat.apply([], data);
這會將您的data
轉換為此結構:
[{Name:"Josh", email:"josh@gmail.com", Points:33},
{Name:"Doug", email:"doug@gmail.com", Points:12},
{Name:"Josh", email:"josh@gmail.com", Points:11},
{Name:"Doug", email:"doug@gmail.com", Points:18},
{Name:"Josh", email:"josh@gmail.com", Points:2},
{Name:"Doug", email:"doug@gmail.com", Points:27}]
並且通過消除對內部.forEach()
的需要,使合並更簡單一些。
var consolidated = flat.reduce(function(holder, obj) {
if (obj.email in holder.emails)
holder.emails[obj.email].Points.push(obj.Points);
else {
holder.emails[obj.email] = obj;
holder.result.push(obj);
obj.Points = [obj.Points];
}
return holder;
}, {emails:{}, result:[]}).result;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.