我正在使用Object.entries
来从嵌套对象中获取一些值并对其进行过滤。
obj = Object.entries(obj)
.filter(([k, v]) => {
return true; // some irrelevant conditions here
});
我的对象最终成为数组,键和数组的数组。
[['key1', val]['key2', val']['key3', val]]
有没有直接的方法将这些映射回对象?原始对象结构是:
{ key:val, key2:val2, key3:val3 }
答案 0 :(得分:19)
当然,只需使用.reduce
分配给新对象:
const input = { key:'val', key2:'val2', key3:'val3' };
const output = Object.entries(input)
.filter(([k, v]) => {
return true; // some irrelevant conditions here
})
.reduce((accum, [k, v]) => {
accum[k] = v;
return accum;
}, {});
console.log(output);

有一个Object.fromEntries
的提案,这使得这更容易 - 您只需传递一系列条目,然后从这些条目创建对象。这适用于最新版本的Firefox和Chrome:
const input = { key:'val', key2:'val2', key3:'val3' };
const output = Object.fromEntries(
Object.entries(input)
.filter(([k, v]) => {
return true; // some irrelevant conditions here
})
);
console.log(output);

答案 1 :(得分:7)
将Object.assign与映射[k,v]
=>的地图结合使用{[k]: v}
例如,以下代码仅保留以key
var obj = {
key: 1,
key2: 2,
key3: 3,
removed: 4,
alsoRemoved: 5
}
obj = Object.assign({}, ...Object.entries(obj)
.filter(([k, v]) => {
return k.startsWith('key');
})
.map(([k, v]) => ({[k]: v}))
);
console.log(obj);

答案 2 :(得分:0)
在deconstruction和comma operator中使用reduce:
const input = { key:'val', key2:'val2', key3:'val3' };
const output = Object.entries(input)
.filter(([k, v]) => {
return true; // some irrelevant conditions here
})
.reduce((acc,[k,v])=>( acc[k]= v, acc ) ,{} );
应该具有与SomePerformance的答案相同的功能,并且语法要简洁一些
答案 3 :(得分:0)
随着点滴传播,它可能是一个衬里。
arr.reduce((a,[k,v])=>({...a,[k]:v}),{})
样品
Object.entries(sampleObject) // Turn object to array
.reduce((a,[k,v])=>({...a,[k]:v}),{}) // Turn it back to object.
答案 4 :(得分:0)
如果您确切地知道要排除的条目,则可以将对象解构与散布结合使用:
function clean(obj) {
const { unwanted1, unwanted2, ...wanted } = obj;
return { ...wanted };
}
在某些情况下,这可能是最干净的解决方案。
答案 5 :(得分:-1)
function undoEntries(entered){
let output = {};
entered.forEach(item => {
output[item[0]] = item[1]
});
return output;
};
// Example
const obj = { a: 1, b: 2, c: 3};
const input = Object.entries(obj);
const output = undoEntries(input);
console.log(output);