使用.map()向JS对象添加递增值

sc2*_*c28 0 javascript

我想知道是否可以使用.map()动态更改JS对象的添加值.

例如,静态使用.map()允许向数组的所有对象添加类似的ID.

friends = [
          {
            "age": 10,
            "name": "Castillo"
          },
          {
            "age": 11,
            "name": "Daugherty"
          },
          {
            "age": 12,
            "name": "Travis"
          }
        ]

// Static mapping --> adds 1 to all objects
friends_static=friends;
friends.map(elem => elem["id"] = 1);
console.log(friends_static)
Run Code Online (Sandbox Code Playgroud)

这回来了 [{age=10, name="Castillo", id=1}, {age=11, name="Daugherty", id=1}, {age=12, name="Travis", id=1}]

是否可以添加一个唯一的ID,以类似的方式为每个对象增加1?

参看 下面的说明性JSfiddle和示例代码.我知道这1++不合法,但只是表明了我想要实现的想法.

//Dynamic mapping? --> should add 1,2,3...to objects incrementally
/*
friends_dynamic=friends;
friends.map(elem => elem["id"] = 1++);
console.log(friends_dynamic)
*/
Run Code Online (Sandbox Code Playgroud)

这应该回来了 [{age=10, name="Castillo", id=1}, {age=11, name="Daugherty", id=2}, {age=12, name="Travis", id=3}]

小智 6

你是这个意思吗?

const friends = [
    {
        "age": 10,
        "name": "Castillo"
    },
    {
        "age": 11,
        "name": "Daugherty"
    },
    {
        "age": 12,
        "name": "Travis"
    }
]

friends.forEach((friend, index) => friend.id = index + 1);

console.log(friends)
Run Code Online (Sandbox Code Playgroud)

  • 是的,虽然你可以*使用map来实现相同的结果,但这样做会非常令人困惑,因为`map()`的语义表明你正在从其他东西创建一些*new*.如果我看到`forEach()`,我就准备好了这样的突变. (3认同)
  • 由于绝对没有数据来支持这一点,`.map()`看起来好像效率低*因为[你还创建了一个'n`元素数组,可能只是未定义的元素](https:// jsfiddle.net/ywd49t1u/) (2认同)

Li3*_*357 5

你可以使用index提供的Array#map回调:

friends.map((friend, index) => Object.assign({}, friend, { id: index + 1 }))
Run Code Online (Sandbox Code Playgroud)

改变对象并不是一个好主意Array#map.该方法的整个目的是返回从原始对象映射的对象.因此用于Object.assign避免突变.

当然,如果你想要变异,那么只需使用forEach而不需要映射到新值.在这种情况下,它将更"语义正确".