给定一个对象:
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"]
)和长度只能在运行时确定。
但是如果不对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);
...这可能意味着它对您的情况没有用。 :-) (编辑:您现在已经确认确实,长度仅在运行时已知。)
既然你需要它是动态的,你不能只用语法来做到这一点;但您可以使用各种标准库工具,如
Object.entries
、Array.prototype.filter
和 Object.fromEntries
:
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
,ifunwantedKeys
太长以至于重新扫描它是一个性能问题(不太可能:-)):
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);