javascript - 使用Reduce Javascript更新对象属性并将它们添加到新的Arr中

标签 javascript arrays javascript-objects reduce square-bracket

我尝试在具有键值对属性的对象数组上使用 addKeyAndValue 函数中的reduce,在每个对象中添加一个新的键值对并将其返回到新数组中。 addKeyAndValue 函数接收三个参数:arr、键和要在数组中的每个对象中相加的值。然后,我在Reduce回调中使用push,将数组中的对象推送到累加器中的新数组,并使用括号表示法更新后的新键和值。

var arr = [{name: 'Alonso'}, {name: 'James'}, {name: 'Chris'}, {name: 'Steve'}]

function addKeyAndValue(arr, key, value){
    return arr.reduce(function(acc, nextValue, idx){
        console.log(next);
        acc.push(nextValue[key] = value);
        return acc;
    },[]);
}

预期结果应该是:

addKeyAndValue(arr, 'title', 'Instructor') // 
      [
        {title: 'Instructor', name: 'Alonso'}, 
        {title: 'Instructor', name: 'James'}, 
        {title: 'Instructor', name: 'Chris'}, 
        {title: 'Instructor', name: 'Steve'}
       ]

但是,我在 Chrome 开发控制台中得到的结果是:

(4) ["Instructor", "Instructor", "Instructor", "Instructor"]
0:"Instructor"
1:"Instructor"
2:"Instructor"
3:"Instructor"
length:4
__proto__:Array(0)

我想知道为什么通过 nextValue[key] 传递的值会覆盖整个对象并仅作为字符串返回。当我尝试将现有对象推送到新数组中时,它工作正常,但是当推送 nextValue[key] 时,它会变成未定义,并且当执行上述 nextValue[key] = value code> 它会覆盖对象,生成一个仅包含 instructor 字符串的新数组。我有点困惑,因为我期待不同的结果。

在 nextValue 上使用方括号符号 nextValue[key] , nextValue 是由 reduce 方法中的回调迭代的数组中的每个对象,我认为在这种情况下会添加一个新的 key 属性 “title”,分配值为“instructor”

如有任何帮助,我们将不胜感激,谢谢:)。

最佳答案

您的push参数只会导致被推送,而不是对象。如果您确实希望在一个表达式中实现这一点,则可以使用逗号运算符来解决此问题:

acc.push((nextValue[key] = value, nextValue));

但如果单独执行,可能会更具可读性:

nextValue[key] = value;
acc.push(nextValue);

关于javascript - 使用Reduce Javascript更新对象属性并将它们添加到新的Arr中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47818218/

相关文章:

java - 打印 Java 数组的最简单方法是什么?

c++ - c++中字符串类型是如何创建的?

javascript - 对象属性在 Javascript 上返回 'undefined'

javascript - JavaScript 中的所有大写常量。并要求。和进口

选择框中的 Javascript 标签

javascript - 如何在backbone.js中为事件编写单元测试

javascript - 将 Javascript 对象编码为 Json 字符串

javascript - 我究竟做错了什么?我正在尝试克隆一些字段并使用一些函数

java - 创建脚本以重新启动主机名位于文本文件中的计算机

javascript - 将数组转换为JavaScript中的对象