如何将数组拆分为具有相似值的子数组?

时间:2017-09-11 17:52:01

标签: javascript

我有数组["oop", "poo", "oop", "kkd", "ddd", "kkd"]

有没有任何优雅的方法可以将它拆分为子数组,因此每个数组都包含具有相同值的元素?

我想实现以下

var arrayOne = ["oop", "oop"]
var arrayTwo = ["poo"]
var arrayThree = ["kkd", "kkd"]
var arrayFour = ["ddd"]

4 个答案:

答案 0 :(得分:3)

你可能会做这样的事情,但这个要求有点像代码味道。

const mixedArray = ["oop", "poo", "oop", "kkd", "ddd", "kkd"];
const splitArrays = {};

mixedArray.forEach(v => {
  if (!!splitArrays[v]) {
    splitArrays[v].push(v);
  } else {
    splitArrays[v] = [v];
  }
})

console.log(splitArrays);

编辑:如果功能纯度是一个问题,那么ug_使用reduce事实上是优选的。

答案 1 :(得分:3)

您可以使用reduce

var arr = ["oop", "poo", "oop", "kkd", "ddd", "kkd"];
var mapped = arr.reduce((map, val)=>{
     if(!map[val]) {
         map[val]=[];
     }
     map[val].push(val); 
     return map;
}, {});

你甚至可以变得奇怪,并使它成为1号衬里,虽然在清晰度方面可能不是最明智的想法。

arr.reduce((m, v)=>(m[v]=m[v]||[]).push(v) && m, {});

答案 2 :(得分:1)

您可以创建一个计算值的字典:

counter = {}

L = myArray.length
for (var i = 0; i < L; i++)
{
    if (myArray[i] in counter)
    {
        counter[myArray[i]]+=1
    }
    else
    {
        counter[myArray[i]]=1
    }
}

答案 3 :(得分:1)

你可以减少和破坏

&#13;
&#13;
var arr = ["oop", "poo", "oop", "kkd", "ddd", "kkd"];
var obj = arr.reduce( (a,b) => (a[b] = a[b] + 1 || 1, a), {});

var [arrayOne, arrayTwo, arrayThree, arrayFour] = Object.keys(obj).map(k=>Array(obj[k]).fill(k));

console.log(arrayOne, arrayTwo, arrayThree, arrayFour);
&#13;
&#13;
&#13;