我需要将下面的对象数组转换为上述结果。
str.replace(/\bmarine\b/i)
结果
list = [{name : 'John', id : '1'}, {name : 'John', id : '2'}, {name : 'John', id : '3'}, {name : 'John', id : '4'}];
怎么能这样做?
答案 0 :(得分:3)
您可以使用临时对象和Array#filter来过滤掉重复项并同时修改原始文件:
var list = [
{name : 'John', id : '1'},
{name : 'John', id : '2'},
{name : 'John', id : '3'},
{name : 'John', id : '4'}
],
temp = {};
list = list.filter(function (o) {
if (temp.hasOwnProperty(o.name)) {
temp[o.name].id += ', ' + o.id;
return false;
}
else {
temp[o.name] = o;
return true;
}
});
document.body.textContent = JSON.stringify(list);

答案 1 :(得分:1)
您可以借助于一个temoprary对象在一个循环中对其进行分组,而不会改变原始数组。
var list = [{ name: 'John', id: '1' }, { name: 'John', id: '2' }, { name: 'John', id: '3' }, { name: 'John', id: '4' }],
grouped = [];
list.forEach(function (a) {
if (!this[a.name]) {
this[a.name] = { data: { name: a.name }, array: [] };
grouped.push(this[a.name].data);
}
this[a.name].array.push(a.id);
this[a.name].data.id = this[a.name].array.join(', ');
}, Object.create(null));
document.write('<pre>' + JSON.stringify(grouped, 0, 4) + '</pre>');
&#13;
稍微更紧凑的版本
var list = [{ name: 'John', id: '1' }, { name: 'John', id: '2' }, { name: 'John', id: '3' }, { name: 'John', id: '4' }],
grouped = [];
list.forEach(function (a) {
if (!this[a.name]) {
this[a.name] = { name: a.name, id: a.id };
grouped.push(this[a.name]);
return;
}
this[a.name].id += ', ' + a.id;
}, Object.create(null));
document.write('<pre>' + JSON.stringify(grouped, 0, 4) + '</pre>');
&#13;
答案 2 :(得分:1)
这是为了解决您的具体问题,而不是更通用的解决方案
function consolidate(list){
var names={};
list.forEach(function(e){
if (!names[e.name]) names[e.name]=[e.id];
else names[e.name].push(e.id);
});
var rtn=[];
Object.keys(names).forEach(function(n){
rtn.push({name:n, id:names[n].join(', ')});
});
return rtn;
}
基本上使用一个对象来累积数据,然后重新映射回一个数组。