【问题标题】:Count duplicate value from array into array of object in javascript [duplicate]将数组中的重复值计数到javascript中的对象数组中[重复]
【发布时间】:2019-10-17 04:38:08
【问题描述】:

目前,我得到了一个这样的数组:

 uniqueCount = [a,a,b,c,d,a,a];

如何计算数组中有多少个 a、b、c?我想要一个像对象数组格式的结果:

[{key: "a", count: 4}
 {key: "b", count: 1}
 {key: "c", count: 1}
 {key: "d", count: 1}]

我的代码:

var current = null;
var count = 0;
 for (var i = 0; i < uniqueCount .length; i++) {
    if (uniqueCount [i] != current) {
      if (count > 0) {
        result.push({
          key: current,
          count: count
        });
      }
      current = uniqueCount [i];
      count = 1;
    } else {
      count++;
    }
  }
  if (count > 0) {
    result.push({
      key: current,
      count: count
    });
  }

但是结果:

[{key: "a", count: 2}
 {key: "b", count: 1}
 {key: "c", count: 1}
 {key: "d", count: 1}
 {key: "a", count: 2}]

谢谢你。

【问题讨论】:

  • 到目前为止有什么努力吗?请发布您到目前为止编写的代码
  • 在过去的两天里,我至少已经看到过两次这个问题,每次都是原始数组元素周围缺少引号。我想知道为什么...
  • 这看起来像是一道面试题……
  • @ASDFGerte - 很高兴知道...这很可疑...
  • @TheSharpieOne 或学校作业

标签: javascript arrays reactjs object


【解决方案1】:

将数组缩减为Map,然后使用Array.from()转换为对象数组:

const array = ['a', 'a', 'b', 'c', 'd', 'a', 'a']

const count = Array.from(
  array.reduce((r, c) => r.set(c, (r.get(c) || 0) + 1), new Map()), 
  (([key, count]) => ({ key, count }))
)

console.log(count)

【讨论】:

    【解决方案2】:

    先统计uniqueCount数组中出现的字符数。然后使用map 生成对象数组,如下所示

    var uniqueCount = ['a','a','b','c','d','a','a'];
    var duplicateCount = {};
    uniqueCount.forEach(e => duplicateCount[e] = duplicateCount[e] ? duplicateCount[e] + 1 : 1);
    var result = Object.keys(duplicateCount).map(e => {return {key:e, count:duplicateCount[e]}});
    console.log(result);

    【讨论】:

      【解决方案3】:
          uniqueCount = ["a","a","b","c","d","a","a"]
          count = {}
          uniqueCount.forEach(x => {
             if(count[x]) {
                 count[x] += 1
             }
              else {
                 count[x] = 1
              }
          })
          const result = Object.keys(count).map(x => { return {key:x, count:count[x]}})
          console.log(result)
      

      【讨论】:

        【解决方案4】:

        你只需要正确地应用条件,检查这个sn-p,首先,我们在数组中找到它的名字f.key === m。如果找到,则将其增加到 1 (uniqueArray[index].count += 1),否则添加到计数为 1 的对象中。

        const array = ['a', 'a', 'b', 'c', 'd', 'a', 'a'];
        
        const uniqueArray = [];
        array.forEach((m) => {
          const obj = { key: m, count: 1 };
          const index = uniqueArray.findIndex((f) => { return f.key === m; });
          index === -1 ? uniqueArray.push(obj) : uniqueArray[index].count += 1;
        });
        
        
        console.log(uniqueArray)

        【讨论】:

        • @CườngBờm 欢迎!
        • @CườngBờm 我建议你回答一个你知道的问题。
        【解决方案5】:

        您应该使用lodash 来处理复杂的数据转换,如您的目标:

        console.log(
          _.chain(uniqueCount)
          .groupBy()
          .map((value, key) => ({ key: key, count: value.length}))
          .value()
        );
        

        Lodash 文档:https://lodash.com/docs/4.17.15

        【讨论】:

        • 感谢您的支持
        猜你喜欢
        • 1970-01-01
        • 2014-02-24
        • 2018-01-08
        • 2018-10-14
        • 2018-09-22
        • 1970-01-01
        • 2021-05-09
        • 2017-08-08
        • 1970-01-01
        相关资源
        最近更新 更多