提取具有JS数组出现次数的重复值

问题描述

例如,我们有一个数组

const nums = [1,1,8,12,2,3,7];

如果我想映射每个数组成员的出现次数,可以使用类似的

function extractDupes(arr) {
  return arr.reduce(function (acc,item) { 
    if (item in acc) {
      acc[item]++
    }
    else {
      acc[item] = 1
    }
    return acc
  },{})
}

这将返回类似对象

{ '1': 2,'2': 1,'3': 3,'7': 1,'8': 1,'12': 1 }

有没有一种最佳方法来过滤出仅使用reduce(一次通过)并显示公正的多次出现的数字

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

解决方法

const nums = [1,1,8,12,2,3,7];
const dups = {};
nums.forEach((v,i,s) => {
  if (s.indexOf(v) != i)
    if (dups[v])
      dups[v]++;
    else
      dups[v] = 2;
});

console.log(dups);

如果您还希望结尾处包含唯一值:

const nums = [1,7];
const dups = {};
const uniques = nums.filter((v,s) => {
  if (s.indexOf(v) != i)
    if (dups[v])
      dups[v]++;
    else
      dups[v] = 2;
  else
    return true;
});

console.log(dups);
console.log(uniques);

,

是否有一个等于1的暂存变量,并在第二次命中它们时将其提升为主要结果?

const nums = [1,7];

function extractDupes(arr) {
  const staging = {}
  return arr.reduce(function (acc,item) { 
    if (item in acc) {
      acc[item]++
    } else if(item in staging) {
      acc[item] = 2
      delete staging[item]
    } else {
      staging[item] = 1
    }
    return acc
  },{})
}

document.getElementById('hi').innerHTML = JSON.stringify(extractDupes(nums))
<div id="hi"></div>

,

您可以为最终对象设置一个嵌套属性。

function extractDupes(array) {
    return array
        .reduce(function(acc,item) {
            if (acc[item]) acc.dupes[item] = (acc.dupes[item] || 1) + 1;
            else acc[item] = true;
            return acc;
         },{ dupes: {} })
        .dupes;
}

const nums = [1,7];

console.log(extractDupes(nums))

,

您可以使用Object.entries将对象转换为键值对,然后过滤值大于1的对,然后通过Object.fromEntries

将对转换回对象。

const nums = [1,7]

function extractDupes(arr) {
  return Object.fromEntries(
    Object.entries(
      arr.reduce(function (acc,item) {
        if (item in acc) {
          acc[item]++
        } else {
          acc[item] = 1
        }
        return acc
      },{})
    ).filter(([key,value]) => value > 1)
  )
}

console.log(extractDupes(nums))

,
let arrAssist = [];

array.sort();
arrAssist.push(inventory[0]);
for(var i = 1; i < array.length; i++){
  if(array[i] != array[i - 1]){
    arrAssist.push(array[i]);
  }
}

在此示例中,arrAssist包含没有重复项的数组

,

它已经被回答并被接受,但是无论如何,这就是我会怎么做。

const nums = [1,7];

const map = nums.reduce((acc,num) => {
  acc.frequency[num] = (acc.frequency[num] || 0) + 1;

  if (acc.frequency[num] > 1) {
    acc.replicates[num] = acc.frequency[num];
  }

  return acc;
},{ frequency: {},replicates: {} });

console.log(map);