无法弄清楚如何正确使用减少

时间:2018-03-24 19:26:38

标签: javascript

我的目标是:

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,但它没有帮助......我只是无法得到它...如果你能帮助我,我将不胜感激

4 个答案:

答案 0 :(得分:3)

使用Array#reduceArray#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;
    }, []);
}

如果您有任何问题,请与我们联系。