将值作为数组添加到对象密钥对



我想将空对象的值添加到动态接收的正确键上。

显然,下面的操作不起作用,因为我用最新的值替换了该键的现有值:

let obj = {};
let key;
let value;
key = // from selectors 
value = // from selectors 
obj[key] = value;

我如何"push"这个键的新值,而不是替换它?

例如,如果key1经过两次迭代后选择了value1value2,则对象的最终结果将是

{"key1": ['value1', 'value2']}

有几种方法可以实现这一点。一种常见的方法是设置obj[key]等于它自己,如果它是null/undefined(即:nullish),则默认为?? [](nullish coalescing)的空数组,然后使用.concat()返回一个带有附加值的新数组:

obj[key] = (obj[key] ?? []).concat(value); // ?? can be replaced with `||` for better browser support

或者使用??=(null coalescing赋值)将obj[key]设置为空数组(如果它为空),然后将.push()推入该数组以更新现有数组

(obj[key] ??= []).push(value);

上面的工作是因为如果obj[key]undefined/null,obj[key] ?? = []会将obj[key]设置为[],然后返回对存储在obj[key]的数组的引用,即我们刚刚创建的数组或obj[key]已经存在的数组。然后我们可以将.push()转换为数组引用,并在obj

中更新它。

试试这个:

if (obj[key] === undefined) obj[key] = []
obj[key].push(value)

赋值时,直接添加到数组中,如果数组不存在,则创建一个

obj[key] = [...(obj[key] ?? []), value];

obj[key] = (obj[key] ?? []).concat(value);

if (!obj[key]) obj[key] = [];
obj[key].push(value);

最新更新