如何使用ES6中的值过滤对象

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)


Rom*_*man 9

对于 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)

  • 这是基于“键不匹配”的过滤,而问题寻求“值匹配”的过滤。 (3认同)

Mar*_*coL 6

只是为了在 @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不起作用,但我想提供另一种观点。


nak*_*nis 6

因为我还没有看到使用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)


gae*_*noM 5

为什么不是一个简单的 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)