Javascript - Поместите элементы массива, включая их дубликаты, в новый массив - PullRequest
2 голосов
/ 24 мая 2019

Я не смог найти ответ на этот конкретный вопрос на SO

Допустим, у меня есть массив строк, или в данном случае, чисел:

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 итератор?

Порядок вывода не имеет большого значения.Просто нужно разбить дубликаты на отдельные массивы, которые я хотел бы сохранить.

Ответы [ 5 ]

5 голосов
/ 24 мая 2019

Вы можете использовать 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 голос
/ 24 мая 2019

Вы можете сделать это с помощью 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>

Использование _.values для извлечения значений объекта группировки и _.groupBy для получения фактическогогруппировки

0 голосов
/ 24 мая 2019

Вот настоятельное решение:

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);
0 голосов
/ 24 мая 2019

Поскольку вы надеетесь использовать Lodash, вас может заинтересовать groupBy. Возвращает объект, но _.values даст вам вложенный массив:

var x = [1, 1, 1, 2, 3, 3, 5, 3, 3, 5, 4, 5];
let groups = _.values(_.groupBy(x))
console.log(groups)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 24 мая 2019

Используйте 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);
...