有没有一种方法可以在 Javascript 中使用...rest 进行对象解构,其中非 rest 键是动态的?

问题描述 投票:0回答:1

说我有一个对象:

const obj = { key1: "value1", key2: "value2", key3: "value3", key4: "value4" };

我想过滤它的键来产生一个更小的对象。我明白我能做到:

const { key1, key2, ...rest } = obj;

然后

rest
变量将被设置为
{ key3: "value3", key4: "value4" }
.

但是如果

key1
key2
被硬编码,是否可以动态地完成类似的事情?假设它们在一个数组
unwantedKeys
中,其值(
["key1", "key2"]
)和长度只能在运行时确定。

javascript arrays typescript dynamic destructuring
1个回答
1
投票

但是如果不对key1和key2进行硬编码,是否可以动态地完成类似的事情呢?假设它们在一个数组 unwantedKeys 中,其值 (["key1", "key2"]) 只能在运行时确定。

是的,但不是完全动态的。你需要知道有多少人。例如,对于其中两个:

const { [unwantedKeys[0]]: unused1, [unwantedKeys[1]]: unused2, ...rest } = obj;

const unwantedKeys = ["key1", "key2"];
const obj = { key1: "value1", key2: "value2", key3: "value3", key4: "value4" };
const { [unwantedKeys[0]]: unused1, [unwantedKeys[1]]: unused2, ...rest } = obj;
console.log(rest);

...这可能意味着它对您的情况没有用。 :-) (编辑:您现在已经确认确实,长度仅在运行时已知。)

既然你需要它是动态的,你不能只用语法来做到这一点;不过,您可以使用各种标准库工具,例如:

const rest = Object.fromEntries(
    Object.entries(obj).filter(([key]) => !unwanted.includes(key))
);

const unwantedKeys = ["key1", "key2"];
const obj = { key1: "value1", key2: "value2", key3: "value3", key4: "value4" };
const rest = Object.fromEntries(
    Object.entries(obj).filter(([key]) => !unwantedKeys.includes(key))
);
console.log(rest);

或者也许用

Set
if
unwantedKeys
太长以至于重新扫描它是一个性能问题(不太可能:-)):

const unwantedSet = new Set(unwantedKeys);
const rest = Object.fromEntries(
    Object.entries(obj).filter(([key]) => !unwantedSet.has(key))
);

const unwantedKeys = ["key1", "key2"];
const obj = { key1: "value1", key2: "value2", key3: "value3", key4: "value4" };
const unwantedSet = new Set(unwantedKeys);
const rest = Object.fromEntries(
    Object.entries(obj).filter(([key]) => !unwantedSet.has(key))
);
console.log(rest);

© www.soinside.com 2019 - 2024. All rights reserved.