【问题标题】:Count the occurrence of a value among multiple associative arrays in JavaScript计算 JavaScript 中多个关联数组中某个值的出现次数
【发布时间】:2018-04-29 01:26:45
【问题描述】:

在许多关联数组中计算某个值出现次数的最佳方法是什么。例如,我们有

var array1 = {
  firstname: 'john',
  lastname: 'bob'
};
var array2 = {
  firstname: 'sara',
 lastname: 'johnson'
};
var array 3 = {
  firstname: 'john',
  lastname: 'paul'
};

在这种情况下,我将如何计算“john”作为名字出现的次数? (返回值应该是2)

【问题讨论】:

  • 这是您在数组中的基本循环然后检查if (firstnam =="john") 增加您定义的计数器并在那里
  • 公认的答案是最糟糕的方法。

标签: javascript arrays associative-array


【解决方案1】:

要使用函数reduce 进行计数,您无需为此创建额外的数组(使用函数filter)。

var array1 = {firstname: 'john',lastname: 'bob'},
    array2 = {firstname: 'sara',lastname: 'johnson'},
    array3 = {firstname: 'john',lastname: 'paul'},
    count = [array1, array2, array3].reduce((a, c) => (a + (Object.keys(c).findIndex(k => k === 'firstname' && c[k] === 'john') > -1)), 0);
    
console.log(count);

【讨论】:

    【解决方案2】:

    将它们放入一个更大的数组中,filterjohn 名称,然后检查它的长度:

    const array1 = {
      firstname: 'john',
      lastname: 'bob'
    };
    const array2 = {
      firstname: 'sara',
      lastname: 'johnson'
    };
    const array3 = {
      firstname: 'john',
      lastname: 'paul'
    };
    const input = [array1, array2, array3];
    const johnCount = input.filter(({ firstname }) => firstname === 'john').length;
    console.log(johnCount);

    【讨论】:

    • 这是最糟糕的方法。创建一个新数组真的没必要。
    • 一般情况下,filter后面跟length,应该是reduce
    • @Ele 为什么不呢?这不像引用已经存在的对象是一个数组是一个昂贵的操作 - 你正在做同样的事情,将对象合并到一个数组中然后迭代它。在处理数据之前清楚地组织数据不应该是一件羞耻的事情。 (虽然被授予,reduce 会更优雅)
    • 是的,我正在放入一个数组中。您的方法是进一步使用函数 filter 创建一个新数组。
    猜你喜欢
    • 2020-01-20
    • 2012-03-24
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多