如何把一个数组中的重复元素分类?

比如有一个数组[4,4,3,3,7,7,7,5,5,5], 怎样把有两个相同的元素放到一个新数组,有三个相同元素放到另外一个数组?

阅读 5.2k
5 个回答
function classify(arr) {
  // 统计每个元素出现的次数
  const countedObj = arr.reduce((ca, x) => {
    ca[x] = ca[x] && ca[x] + 1 ||  1
    return ca
  }, {})

  // 把出现次数相同的元素组合成数组
  const composedObj = Object.entries(countedObj).reduce((co, el) => {
    co[el[1]] = co[el[1]] || []
    co[el[1]].push(el[0])
    return co
  }, {})

  // 生成目标数组
  return Object.entries(composedObj).reduce((re, it) => {
    re.push(it[1].reduce((subArr, a) => {
      return subArr.concat(Array.from({length: it[0]}, x => +a))
    }, []))
    return re
  }, [])
}

let arr = [4,4,3,3,7,7,7,5,5,5]
console.log(classify(arr)) // => [[3,3,4,4], [5,5,5,7,7,7]]
const arr = [4,4,3,3,7,7,7,5,5,5]
const cache = {}
const result1 = []
const result2 = []
arr.forEach(v => {
  if (cache[v] === undefined) {
    cache[v] = 1
  } else {
    cache[v] += 1
  }
})
for (let key in cache) {
  if (cache[key] === 2) {
    result1.push(key)
  } else if (cache[key] === 3) {
    result2.push(key)
  }
}
console.log(result1)
console.log(result2)

基本思路用map统计每个数字出现的次数,然后去循环这个map。

var array = [4,4,3,3,7,7,7,5,5,5];
    var map = {};
    for (var i=0;i<array.length;i++) {
        console.log(array[i]);
        if (typeof(map[array[i]])=="undefined") {
            map[array[i]] = 1;
        } else {
            map[array[i]] = map[array[i]] + 1;
        }
    }
    for (var i in map) {
        console.log("数字"+i+"有"+map[i]+"个");
    }

图片描述

统计成员出现的次数,reduce很方便

统计各个数据出现的次数,并返回一个对象

let arr = [4, 4, 3, 3, 7, 7, 7, 5, 5, 5, 6, 8, 8, 8, 8, 9, 12, 11, , 9, 9];
let obj = arr.reduce((prev, curr) => {
  if (prev[curr]) {
    prev[curr] = prev[curr] + 1;
  } else {
    prev[curr] = 1;
  }
  return prev;
}, {});

obj 是一个对象

{"3":2,"4":2,"5":3,"6":1,"7":3,"8":4,"9":3,"11":1,"12":1}

根据统计的数据去整理

//收集次数 numArr这里是[2,3,1,4]
let numArr = [...new Set(Object.values(obj))];
let numObj = numArr.map((v, i) => {
  let sameArr = [];
  for (let [value, item] of Object.entries(obj)) {
    if (v == item) {
      sameArr.push(value)
    }
  }
  return {
    time: v,//出现次数
    item: sameArr,//出现改次数的元素
  }
})

最后得到numObj

[
    {
        "time": 2,
        "item": ["3","4"]
    },
    {
        "time": 3,
        "item": ["5","7","9"]
    },
    {
        "time": 1,
        "item": ["6","11","12"]
    },
    {
        "time": 4,
        "item": ["8"]
    }
]
新手上路,请多包涵
      var arr = [4,4,3,3,7,7,7,5,5,5];
      var numObj = arr.reduce(function(prev,curr){
            if(!prev[curr]){
                prev[curr] = 1;
            }else{
                ++prev[curr]
            }
            return prev;
        },{})

        var double = [];
        var triple = [];
        for(var i in numObj){
            if(numObj[i] == 2){
                double.push(+i);
            }else{
                triple.push(+i);
            }
        }
        console.log(double,triple)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题