我有数组["oop", "poo", "oop", "kkd", "ddd", "kkd"]
。
有没有任何优雅的方法可以将它拆分为子数组,因此每个数组都包含具有相同值的元素?
我想实现以下
var arrayOne = ["oop", "oop"]
var arrayTwo = ["poo"]
var arrayThree = ["kkd", "kkd"]
var arrayFour = ["ddd"]
答案 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)
你可以减少和破坏
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;