使用 map 函数在 JavaScript 中创建关联数组
Creating an associative array in JavaScript using the map function
我有一个具有以下格式的对象数组
[{'list': 'one', 'item': 1},
{'list': 'one', 'item': 2},
{'list': 'one', 'item': 3},
{'list': 'two', 'item': 1},
{'list': 'two', 'item': 2}]
我想这样改造
[{'one': [1, 2, 3]},
{'two': [1, 2]}]
如何使用 Array.map 函数来实现?这是最好的选择吗?
您正在寻找分组方法。这个问题有一个很好的答案:https://codereview.stackexchange.com/questions/37028/grouping-elements-in-array-by-multiple-properties
代码:
function groupBy(array, f)
{
var groups = {};
array.forEach(function(o)
{
var group = JSON.stringify(f(o));
groups[group] = groups[group] || [];
groups[group].push(o);
});
return Object.keys(groups).map(function(group)
{
return groups[group];
})
}
var result = groupBy(list, function(item)
{
return [item.lastname, item.age];
});
针对您的具体问题:
// Let x hold your array of objects.
res={}; // Create an empty object that will hold the answer
x.forEach (function (e) { // Use this function to iterate over each item in the list
res[e.list] = res[e.list] || []; // inspired by the Nina Scholz answer below
res[e.list].push(e.item); // Append the result to the array
});
您可以使用 Array.prototype.reduce
来完成您的任务。它允许在下一次调用的回调函数中使用 return 值。
var data = [
{ 'list': 'one', 'item': 1 },
{ 'list': 'one', 'item': 2 },
{ 'list': 'one', 'item': 3 },
{ 'list': 'two', 'item': 1 },
{ 'list': 'two', 'item': 2 }
],
flat = data.reduce(function (r, a) {
r[a.list] = r[a.list] || [];
r[a.list].push(a.item);
return r;
}, {});
document.write('<pre>' + JSON.stringify(flat, 0, 4) + '</pre>');
我有一个具有以下格式的对象数组
[{'list': 'one', 'item': 1},
{'list': 'one', 'item': 2},
{'list': 'one', 'item': 3},
{'list': 'two', 'item': 1},
{'list': 'two', 'item': 2}]
我想这样改造
[{'one': [1, 2, 3]},
{'two': [1, 2]}]
如何使用 Array.map 函数来实现?这是最好的选择吗?
您正在寻找分组方法。这个问题有一个很好的答案:https://codereview.stackexchange.com/questions/37028/grouping-elements-in-array-by-multiple-properties
代码:
function groupBy(array, f)
{
var groups = {};
array.forEach(function(o)
{
var group = JSON.stringify(f(o));
groups[group] = groups[group] || [];
groups[group].push(o);
});
return Object.keys(groups).map(function(group)
{
return groups[group];
})
}
var result = groupBy(list, function(item)
{
return [item.lastname, item.age];
});
针对您的具体问题:
// Let x hold your array of objects.
res={}; // Create an empty object that will hold the answer
x.forEach (function (e) { // Use this function to iterate over each item in the list
res[e.list] = res[e.list] || []; // inspired by the Nina Scholz answer below
res[e.list].push(e.item); // Append the result to the array
});
您可以使用 Array.prototype.reduce
来完成您的任务。它允许在下一次调用的回调函数中使用 return 值。
var data = [
{ 'list': 'one', 'item': 1 },
{ 'list': 'one', 'item': 2 },
{ 'list': 'one', 'item': 3 },
{ 'list': 'two', 'item': 1 },
{ 'list': 'two', 'item': 2 }
],
flat = data.reduce(function (r, a) {
r[a.list] = r[a.list] || [];
r[a.list].push(a.item);
return r;
}, {});
document.write('<pre>' + JSON.stringify(flat, 0, 4) + '</pre>');