更改对象数组的内部属性而无需循环

时间:2019-11-22 10:24:31

标签: javascript

我想更改以下代码,我想将user_uuid插入数组中的每个对象中,但是我不想使用循环。

const test = [
    { n: 1, m: 2 },
    { n: 6, m: 2 },
    { n: 3, m: 4 }
];

const user_uuid = 3;

是否可以更改为

const test = [
    { n: 1, m: 2,user_uuid:3 },
    { n: 6, m: 2,user_uuid:3 },
    { n: 3, m: 4,user_uuid:3 }
];

1 个答案:

答案 0 :(得分:4)

假设这些对象没有什么特别之处,¹不,没有 some 循环就无法做到这一点。

简单的直接方法是...一个实际的循环:

for (const entry of test) {
    entry.user_uuid = 3;
}

或者有forEach

test.forEach(entry => {
    entry.user_uuid = 3;
});

但是forEach仍然是一个循环,该循环就在forEach内,它在每次迭代时都调用您的回调。

类似地,您可以使用map并使用属性扩展(ES2018 +)构建新对象和新数组:

test = test.map(entry => ({...entry, user_uuid: 3}));

...但这仍然是一个循环。


¹例外情况是:

  1. 您要更改的所有对象都共享同一原型,并且

  2. 不想要更改的对象都没有该原型

在这种情况下,如果对象是特殊的,则可以通过将属性添加到原型中来实现:

Object.getPrototypeOf(test[0]).user_uuid = 3;

这实际上并没有将属性添加到对象中,并且如果您(例如)在这些对象上使用JSON.stringify也不会包含该属性,但是执行test[1].user_uuid会给您带来价值3在这种特殊情况下。