我有一个json,其中有类似的属性,
{
"audio_file1": "...",
"audio_file2": "...",
"audio_file3": "...",
"audio_file4": "...",
...
}
我正在尝试删除所有属性audio_fileX
。我的第一次尝试是在函数中使用for/loop
来接收数组,初始位置和最大文件数。
删除audio_fileX
之类的属性的最有效方法是什么?
答案 0 :(得分:2)
为避免在其他答案中使用spread syntax ...
造成开销,建议您使用函数Object.assign
。
const obj = { "audio_file1": "...", "audio_file2": "...", "audio_file3": "...", "audio_file4": "...", "myown": "Ele"},
start = "audio_file",
result = Object.keys(obj).reduce((a, c) => c.startsWith(start) ? a : Object.assign(a, {[c]: obj[c]}), Object.create(null));
console.log(result);
答案 1 :(得分:1)
将属性归约到新对象中,如果属性不是以字符串开头的,则reduce的每次迭代都会将属性传播到新结果中,或者不包含字符串而返回先前的结果。
removeBetterPerformance可以执行相同的操作,但会更改先前的结果以获得更好的性能,但会牺牲功能纯度。对于少量属性来说,这是不必要的。
let obj = {
audio_file1: "...",
audio_file2: "...",
audio_file3: "...",
audio_file4: "...",
other: "..."
};
const remove = (obj, str) =>
Object.getOwnPropertyNames(obj).reduce(
(result, property) => (property.startsWith(str) ? result : { ...result, [property]: obj[property] }),
{}
);
console.log(remove(obj, 'audio_file'));
const removeBetterPerformance = (obj, str) =>
Object.getOwnPropertyNames(obj).reduce((result, property) => {
if (!property.startsWith(str)) {
result[property] = obj[property];
}
return result;
}, {});
答案 2 :(得分:0)
从您的问题出发,很难判断您是使用JSON(如您所说的)还是使用JavaScript对象。
对于这个答案,我假设您以一种方式导入了JSON,并已通过JSON.parse()
将其转换为JavaScript对象。
因此,要摆脱它,您将剩下:
const obj = {
audio_file1 : "...",
audio_file2 : "...",
audio_file3 : "...",
audio_file4 : "...",
...
};
从这里开始,您要遍历对象,找到包含字符串“ audio_file”的键,并将其从对象中删除。
下面的代码片段演示了如何使用ES6方法实现这一目标:
const obj = {
audio_file1 : "...",
audio_file2 : "...",
audio_file3 : "...",
audio_file4 : "...",
};
for (let key in obj) {
if (key.startsWith('audio_file')) {
delete(obj[key]);
}
}
console.log(obj);
要对此进行简要说明,代码将遍历对象的每个键,并检查它是否以“ audio_file”开头,如果是,则将其删除。您可以看到控制台最终记录了一个空对象,因为所有当前键都以该字符串开头。