【问题标题】:a function to count occurrences or frequency of an element and return an object but remove elements which occurs one and return the rest一个计算元素出现次数或频率并返回一个对象但删除出现一个的元素并返回其余元素的函数
【发布时间】:2020-02-10 19:01:45
【问题描述】:

所以我有这个功能

function counting(arr) {
  result = {};
  for (var i = 0; i < arr.length; i++) {
    if (!result[arr[i]]) result[arr[i]] = 0;
    ++result[arr[i]];
  }
  return result;
}

arr = [1, 2, 3, 4, 6, 6, 7, 8, 9, 5, 2, 6, 1, 8]
console.log(counting(arr))

我得到了这个结果

{ '1': 2,
  '2': 2,
  '3': 1,
  '4': 1,
  '5': 1,
  '6': 3,
  '7': 1,
  '8': 2,
  '9': 1 }

但我真正想要的是删除每个元素只有 1 次出现而让其他元素出现不止一次的功能,如下所示

{ '1': 2,
  '2': 2,
  '6': 3,
  '8': 2}

【问题讨论】:

  • 所以查看条目并减少它。
  • NB:更简单的循环代码:let key = arr[i]; result[key] = (result[key] || 0) + 1
  • @Alnitak 用我的循环替换你的代码我得到这个结果 { '1': 1 }
  • 不,它是用于循环内部的,用于替换 if (!element) element = 0 测试

标签: javascript arrays function javascript-objects


【解决方案1】:

你可以用一个循环来完成,通过两个独立的频率图。

function counting(arr) {
    const [freq, result] = [{}, {}];
    arr.forEach(i => {
        freq[i] = (freq[i] || 0) + 1;
        if (freq[i] > 1) result[i] = freq[i];
    });

    return result;
}

【讨论】:

    【解决方案2】:

    所以循环你的结果集并再次减少它。

    const arr = [1,2,3,4,6,6,7,8,9,5,2,6,1,8]
    
    const counts = arr.reduce(function (o, n) {
      o[n] = o[n] || 0;
      o[n]++
      return o
    }, {})
    const result = Object.entries(counts)
      .reduce(function (o, v) {
        if (v[1] > 1) {
          o[v[0]] = v[1]
        }
        return o
      }, {})
    
    console.log(result)

    【讨论】:

    • 只是为了好玩:const counts = arr.reduce((o, n) =&gt; (o[n] = (o[n] || 0) + 1, o), {}); - 这使用逗号运算符来避免显式的return
    【解决方案3】:

    你可以把它分解成几个函数:

    1. 获取数组中元素频率的函数。
    2. 删除不大于 1 的属性的函数。

    const test = [1, 2, 3, 4, 6, 6, 7, 8, 9, 5, 2, 6, 1, 8]
    
    const frequency = arr =>
      arr.reduce((o, x) => {
        o[x] = (o[x] || 0) + 1
        return o
      }, {})
    
    const dropSingleOccurrences = counts =>
      Object.entries(counts).reduce((o, [k, v]) => {
        if (v > 1) o[k] = v
        return o
      }, {})
    
    const result = dropSingleOccurrences(frequency(test))
    
    console.log(result)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      相关资源
      最近更新 更多