我无法在S.O上找到针对这个特定问题的答案。
假设我有一个字符串数组,或者在这种情况下是数字:
var x = [1, 1, 1, 2, 3, 3, 5, 3, 3, 5, 4, 5];
我希望输出为:
var output = [[1,1,1], [2], [3,3,3,3,3], [4], [5, 5, 5]];
我希望使用Lodash,但是大多数东西都倾向于删除重复项,而是将它们分块在一起形成自己的数组。也许是某种.map
迭代器?
输出的顺序并不重要。它只需要将重复项分块成我想保留的单独数组。
答案 0 :(得分:5)
您可以使用reduce
将数组元素分组为一个对象。使用Object.values
将对象转换为数组。
var x = [1, 1, 1, 2, 3, 3, 5, 3, 3, 5, 4, 5];
var result = Object.values(x.reduce((c, v) => {
(c[v] = c[v] || []).push(v);
return c;
}, {}));
console.log(result);
更短版本:
var x = [1, 1, 1, 2, 3, 3, 5, 3, 3, 5, 4, 5];
var result = Object.values(x.reduce((c, v) => ((c[v] = c[v] || []).push(v), c), {}));
console.log(result);
答案 1 :(得分:1)
您可以使用Array.reduce这样的简洁方式来做到这一点:
var x = [1, 1, 1, 2, 3, 3, 5, 3, 3, 5, 4, 5]
let result = x.reduce((r,c) => (r[c] = [...(r[c] || []), c],r), {})
console.log(Object.values(result))
与lodash完全相同的是:
var x = [1, 1, 1, 2, 3, 3, 5, 3, 3, 5, 4, 5]
let result = _.values(_.groupBy(x))
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
答案 2 :(得分:0)
使用Array#prototype#reduce
对它们进行分组:
const x = [1, 1, 1, 2, 3, 3, 5, 3, 3, 5, 4, 5];
let helperObj = {};
const res = x.reduce((acc, curr) => {
// If key is not present then add it
if (!helperObj[curr]) {
helperObj[curr] = curr;
acc.push([curr]);
}
// Else find the index and push it
else {
let index = acc.findIndex(x => x[0] === curr);
if (index !== -1) {
acc[index].push(curr);
}
}
return acc;
}, []);
console.log(res);
答案 3 :(得分:0)
由于您希望使用Lodash,因此您可能会对groupBy
感兴趣。它返回对象,但是def reverse_vowels(word):
all_vowels = ['a', 'e', 'i', 'o', 'u']
vowels = []
for char in word:
if char.lower() in all_vowels:
vowels.append(char.lower())
new_word = ''
for char in word:
if char.lower() in all_vowels:
vowel = vowels.pop(-1)
if char.isupper():
vowel = vowel.upper()
new_word += vowel
else:
new_word += char
return new_word
将为您提供嵌套数组:
_.values
var x = [1, 1, 1, 2, 3, 3, 5, 3, 3, 5, 4, 5];
let groups = _.values(_.groupBy(x))
console.log(groups)
答案 4 :(得分:0)
这是当务之急:
var x = [1, 1, 1, 2, 3, 3, 5, 3, 3, 5, 4, 5];
x.sort();
var res = [];
for (const [i, n] of x.entries()) {
if (n !== x[i-1]) res.push([n]);
else res[res.length-1].push(n);
}
console.log(res);