我的目标是:
var arr = [{name: 'Alex'},{name: 'Mia'},{name: 'David'}];
bz(arr,'areWeAwesome','shuAr')
这应该将arr
更改为:
[{name: 'Alex', areWeAwesome: 'shuAr'},{name: 'Mia', areWeAwesome: 'shuAr'},{name: 'David', areWeAwesome: 'shuAr'}];
我实际上知道如何做到这一点:
function bz(zarr,zkey,zval) {
for(var i in zarr) {
zarr[i][zkey] = zval;
}
}
但是我无法弄清楚如何用reduce
实现这个...我只是看不到它。我尝试了很多变化,最后一个是:
function bzz(zarr,zkey,zval) {
return zarr.reduce(function(acc,val){
return acc[val[zkey] = zval]
},[{}]);
}
我在MDN文档中读到了reduce
,但它没有帮助......我只是无法得到它...如果你能帮助我,我将不胜感激
答案 0 :(得分:3)
使用Array#reduce
和Array#concat
获取具有所需键/值对的新对象。
function bz(array, key, value) {
return array.reduce((r, o) => r.concat(Object.assign({}, o, { [key]: value })), []);
}
var arr = [{name: 'Alex'},{name: 'Mia'},{name: 'David'}];
console.log(bz(arr,'areWeAwesome','shuAr'));
使用Array#map
,这是首选,因为它返回一个数组,其中包含给定数组中每个项的值。
function bz(array, key, value) {
return array.map(o => Object.assign({}, o, { [key]: value }));
}
var arr = [{name: 'Alex'},{name: 'Mia'},{name: 'David'}];
console.log(bz(arr,'areWeAwesome','shuAr'));
答案 1 :(得分:0)
你真的不应该使用reduce ......
var arr = [{name: 'Alex'},{name: 'Mia'},{name: 'David'}];
const bz = (arr, prop, value) =>
arr.reduce((acc, e) => {
acc.push({ [prop]: value, ...e });
return acc;
}, []);
console.log(bz(arr,'areWeAwesome','shuAr'));
答案 2 :(得分:0)
这是另一种选择:
函数concat
允许您将先前的元素与新元素连接起来,另一方面,函数Object.assign
将新属性分配给当前对象。
function bz(arr, key, value) {
return arr.reduce((a, c) => (a.concat(Object.assign({}, c, {[key]: value}))), []);
}
var arr = [{name: 'Alex'},{name: 'Mia'},{name: 'David'}];
console.log(bz(arr,'areWeAwesome','shuAr'));
.as-console-wrapper { max-height: 100% !important; top: 0; }
但是,更好的方法是使用函数map
:
function bz(arr, key, value) {
return arr.map((c) => Object.assign({}, c, {[key]: value}));
}
var arr = [{name: 'Alex'},{name: 'Mia'},{name: 'David'}];
console.log(bz(arr,'areWeAwesome','shuAr'));
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 3 :(得分:0)
我会使用map
而不是reduce
。
主要原因是,reduce应该将事物“减少”为一个值(即添加数字)而不是向数组添加内容。
map
将迭代一个数组,进行任何更改并返回该数组的新副本,并附带更改。
但是要回答你的问题,这里有一些适合你的代码:
function bzz(zarr,zkey,zval) {
return zarr.reduce(function(acc,val){
val[zkey]=zval;
acc.push(val);
return acc;
}, []);
}
如果您有任何问题,请与我们联系。