saa*_*ann 9 javascript filtering object ecmascript-6
在ES6中以这种方式过滤对象的最佳方法是什么?
开始数据:
const acceptedValues = ["value1","value3"]
const myObject = {
prop1:"value1",
prop2:"value2",
prop3:"value3"
}
Run Code Online (Sandbox Code Playgroud)
预期产量:
filteredObject = {
prop1:"value1",
prop3:"value3"
}
Run Code Online (Sandbox Code Playgroud)
Nen*_*car 12
您可以使用reduce()创建新对象并includes()检查对象的值是否存在于数组中.
const acceptedValues = ["value1", "value3"]
const myObject = {
prop1: "value1",
prop2: "value2",
prop3: "value3"
}
var filteredObject = Object.keys(myObject).reduce(function(r, e) {
if (acceptedValues.includes(myObject[e])) r[e] = myObject[e]
return r;
}, {})
console.log(filteredObject)Run Code Online (Sandbox Code Playgroud)
对于 ES6,如果您需要静态代码(您确切地知道需要过滤哪些属性)并且它不依赖于应用程序状态,那么您可以使用以下解构技术:
const myObject = {
prop1: 'value1',
prop2: 'value2',
prop3: 'value3'
}
const { prop2, ...filteredObject } = myObject
console.info({ filteredObject, prop2 })
Run Code Online (Sandbox Code Playgroud)
你将拥有:
filteredObject: {prop1: "value1", prop3: "value3"}
prop2: "value2"
Run Code Online (Sandbox Code Playgroud)
只是为了在 @Nenad Vracar 好的答案之上构建,您可以使用对象而不是数组来includes加快查找速度:
const acceptedValues = ["value1", "value3"];
const myObject = {
prop1: "value1",
prop2: "value2",
prop3: "value3"
};
const lookup = acceptedValues.reduce( (memo, prop) => {
memo[prop] = true;
return memo;
});
const filteredObject = Object.keys(myObject).reduce((filtered, key) => {
if(lookup[myObject[key]]){
filtered[key] = myObject[key];
}
return filtered;
}, {});
console.log(filteredObject);Run Code Online (Sandbox Code Playgroud)
也不是说它includes不起作用,但我想提供另一种观点。
因为我还没有看到使用Object.entries这里的答案。请注意,由于Object.entries()实现速度明显慢于Object.keys(),这也将慢于接受的答案,但有些人可能更喜欢这样做,以提高可读性或可扩展性(更容易传递不同的过滤函数)。
const acceptedValues = ["value1", "value3"];
const myObject = {
prop1:"value1",
prop2:"value2",
prop3:"value3"
};
const filteredEntries = Object.entries(myObject).filter(([, v]) => acceptedValues.includes(v));
const filteredObject = Object.fromEntries(filteredEntries);
Run Code Online (Sandbox Code Playgroud)
或者作为一个较长的单行:
const filteredObject = Object.fromEntries(Object.entries(myObject).filter(([, v]) => accepted.includes(v)));
Run Code Online (Sandbox Code Playgroud)
为什么不是一个简单的 for 循环呢?
const acceptedValues = ["value1","value3"]
const myObject = {
prop1:"value1",
prop2:"value2",
prop3:"value3"
};
var filteredObject = {};
for(e in myObject) {
if (myObject.hasOwnProperty(e)) {
if (acceptedValues.indexOf(myObject[e]) != -1) {
filteredObject[e] = myObject[e];
}
}
}
console.log(filteredObject);Run Code Online (Sandbox Code Playgroud)