我有一个对象的数组,像这样:
let array = [{
"Age": 20,
"Name": "Kevin"
}, {
"Age": 15,
"Name": "Alfred"
}, {
"Age": 30,
"Name": "Joe"
}];
我想要一个这样的对象:
{
"Age": '20, 15, 30',
"Name": 'Kevin, Alfred, Joe'
}
如果我这样做:
let r = array.reduce(function(pV, cV) {
Object.keys(cV).map(function(key){
pV[key] = (pV[key] || []).concat(cV[key]);
});
return pV;
},{});
console.log(r); // { "Age": [20, 15, 30], "Name": ['Kevin', 'Alfred', 'Joe'] }
或者,如果我这样做:
let r = array.reduce(function(pV, cV) {
Object.keys(cV).map(function(key){
pV[key] = (pV[key] || '') + ', ' + cV[key];
});
return pV;
},{});
console.log(r); // { "Age": ', 20, 15, 30', "Name": ', Kevin, Alfred, Joe' }
我有点迷路了。有关如何获得所需物品的一些想法?
答案 0 :(得分:3)
您与第二个方法非常接近,只需确保不出现开头的,
,使用三元数就很容易了:
let r = array.reduce(function(pV, cV) {
Object.keys(cV).map(function(key){
pV[key] = (pV[key] ? (pV[key] + ", ") : '') + cV[key];
});
return pV;
},{});
答案 1 :(得分:2)
您可以尝试使用.reduce()
和Object.keys
let array = [{
"Age": 20,
"Name": "Kevin"
}, {
"Age": 15,
"Name": "Alfred"
}, {
"Age": 30,
"Name": "Joe"
}];
let result = array.reduce((current,result) => {
Object.keys(current).forEach(key => {
if(!result[key]){
result[key] = current[key];
} else {
result[key]+= ", " + current[key];
}
})
return result;
},{});
console.log(result);
答案 2 :(得分:2)
我不会像这样使用reduce
,这只是光荣的循环:
let r = {};
for (const cV of array) {
for (const key in cV) {
r[key] = (r[key] || []).concat(cV[key]);
}
}
对于一种实用的方法,在map
实际上有用的情况下,我将迭代嵌套在相反的方向:
let r = {};
for (const key of ["Age", "Name"]) { // or Object.keys(array[0])
r[key] = array.map(function(cV){
return cV[key];
}).join(", ");
}
答案 3 :(得分:0)
您也可以采用这种方式。
array.reduce((a,n)=>{
a.Age = a.Age+','+n.Age;
a.Name = a.Name+','+n.Name;
return a;
});
警告!这种方法与修改对象的实际数组有关。 如果这不是故意的,那么您可以先克隆对象,然后再进行reduce。
我做了JSON.parse(JSON.stringify(array))
的克隆数组,您可以使用自己的方式对它进行深度克隆。
JSON.parse(JSON.stringify(array)).reduce((a,n)=>{
a.Age = a.Age+', '+n.Age;
a.Name = a.Name+', '+n.Name;
return a;
})