Вернуть вложенный массив - PullRequest
1 голос
/ 16 марта 2020

Мне нужна помощь в создании этой функции после получения массива и другого массива (дубликата), в котором есть только числа, которые дублируются в первом массиве (например, array=[1,2,3,1,2,3,4,5,6,6], duplicate=[1,2,3,6]).

I хотите, чтобы он возвращал массив следующим образом: finalArray1=[[1,1],[2,2],[3,3],4,5,[6,6]].

let input = [1,2,4,591,392,391,2,5,10,2,1,1,1,20,20];

let sortArray = array => {
  return array.sort(function(a, b) {
    return a - b;});
}

function findDuplicates(data) {

  let duplicate = [];

  data.forEach(function(element, index) {

    // Find if there is a duplicate or not
    if (data.indexOf(element, index + 1) > -1) {

      // Find if the element is already in the duplicate array or not
      if (duplicate.indexOf(element) === -1) {
        duplicate.push(element);
      }
    }
  });

  return duplicate; 
}

let newArray = (array, duplicate) => { 

  for( var i = 0; i < 3; i++ ){
    for( var j = 0; j < 15; j++ ){
      if( duplicate[i] == array[j] ){
        let finalArray = new array().push(array[j]);
      }
    }
    return finalArray;
  }
}

Ответы [ 2 ]

2 голосов
/ 16 марта 2020

Вы можете взять Map и вернуться в исходном порядке.

Карта принимает элементы в порядке следования, что означает, что все элементы находятся позже в исходном порядке. Если ключ существует, он создает массив со значением. В противном случае в качестве значения для карты берется только элемент из массива.

В конце берут только значения из карты и создают его массив.

let input = [1, 2, 4, 591, 392, 391, 2, 5, 10, 2, 1, 1, 1, 20, 20],
    result = Array.from(input
        .reduce((m, v) => m.set(v, m.has(v) ? [].concat(m.get(v), v) : v), new Map)
        .values()
    );

console.log(result);

Более традиционный подход

let input = [1, 2, 4, 591, 392, 391, 2, 5, 10, 2, 1, 1, 1, 20, 20],
    result = input
        .sort((a, b) => a -b)
        .reduce((r, v, i, a) => {
            if (a[i - 1] !== v && v !== a[i + 1]) r.push(v); // check if unique
            else if (a[i - 1] !== v) r.push([v]);            // check left element
            else r[r.length - 1].push(v);
            return r;
        }, []);

console.log(result);
0 голосов
/ 16 марта 2020

Я думаю, что следующее может работать для вас:

const input = [1,2,4,591,392,391,2,5,10,2,1,1,1,20,20];

const inOrder = input.sort((a, b) => a - b);
const unique = inOrder.reduce((a, c) => {
  const found = a.find(e => e.includes(c));      
  if (found) found.push(c);
  else a.push([c]);      
  return a;
}, []);
const result = unique.map(e => e.length > 1 ? e : e[0]);

console.log(result);

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...