遍历对象列表并检查属性值

时间:2019-12-14 13:45:45

标签: javascript performance loops

我有一个对象列表:

var myObj = {
   obj1: {name: "bob", employed: true},
   obj2: {name: "dave", employed: false},
   obj3: {name: "james", employed: true},
}

迭代对象列表并计算多少个对象等于employed: true的最有效/最优雅的方法是什么。有写这个的简短方法吗?我正在考虑像下面这样实现它:

const countEmployed = () => {
    for (let key in myObj) {
      if (myObj .hasOwnProperty(key)) {
      }
    }
}

3 个答案:

答案 0 :(得分:1)

您可以在.reduce()上使用Object.values(),方法是使用employed的布尔值作为一个数字,将其添加到总数中,如下所示:

const myObj = {
   obj1: {name: "bob", employed: true},
   obj2: {name: "dave", employed: false},
   obj3: {name: "james", employed: true},
};

const sum = Object.values(myObj).reduce((t, {employed}) => t+employed, 0);
console.log(sum);

答案 1 :(得分:0)

通常,效率不等于优雅,但是,如果您正在寻找一种简短而优雅的方法,则可以使用Array#filter

const myObj = {
   obj1: {name: "bob", employed: true},
   obj2: {name: "dave", employed: false},
   obj3: {name: "james", employed: true},
};

const r = Object.values(myObj).filter(({ employed }) => employed).length;

console.log(r);

但是,最有效的方法可能是使用for in循环,如果employed的值为真,则仅增加一个计数器。

答案 2 :(得分:0)

从技术上讲,您可以使用Object.values()首先获取所有属性值。然后,您可以使用Array.filter()仅获取必要的内容。

基于此,我将执行以下操作:

const myObj = {
   obj1: {name: "bob", employed: true},
   obj2: {name: "dave", employed: false},
   obj3: {name: "james", employed: true},
}

const result = Object.values(myObj).filter(e => e.employed);
console.log('Count:', result.length);

在此处进一步阅读:

  1. Array.prototype.filter()
  2. Object.values()

我希望这会有所帮助!

相关问题