Союз между тремя массивами - PullRequest
0 голосов
/ 15 декабря 2018

Мне нужно найти объединение трех массивов, которые передаются в функцию union.

Мне потребовалось около 50 строк, чтобы получить ожидаемый результат.Очевидно, что следующий код работает, но теперь мне интересно, как лучше (функционально или не функционально) выполнять ту же работу.

function union(...arrays) {
    var array1 = arguments[0];
    var array2 = arguments[1];
    var array3 = arguments[2];      

    var unique = [];
    var intersaction = [];

    // find the unique values

    for(let i = 0; i < array1.length; i++) {
        if( (array2.includes(array1[i]) == false) && (array3.includes(array1[i])) == false ) {
            unique.push(array1[i]); 
        }
    }

    for(let i = 0; i < array2.length; i++) {
        if( (array1.includes(array2[i]) == false) && (array3.includes(array2[i])) == false ) {
            unique.push(array2[i]); 
        }
    }

    for(let i = 0; i < array3.length; i++) {
        if( (array1.includes(array3[i]) == false) && (array2.includes(array3[i])) == false ) {
            unique.push(array3[i]);
        }
    }

    // find the intersection

    for(let j = 0; j < array1.length; j++) {
        if(array2.includes(array1[j]) || array3.includes(array1[j]) ) {
            if (intersaction.indexOf(array1[j]) == -1) { 
                intersaction.push(array1[j]);
            }
        }
    }

    for(let j = 0; j < array2.length; j++) {
        if(array1.includes(array2[j]) || array3.includes(array2[j]) ) {
            if (intersaction.indexOf(array2[j]) == -1) { 
                    intersaction.push(array2[j]);
            }       
        }
    }

    for(let j = 0; j < array3.length; j++) {
        if(array1.includes(array3[j]) || array2.includes(array3[j]) ) {
            if (intersaction.indexOf(array3[j]) == -1) { 
                    intersaction.push(array3[j]);
            }       
        }
    }

    return union = [...intersaction, ...unique];

}

console.log(union([5, 10, 15], [15, 88, 1, 5, 7], [100, 15, 10, 1, 5]));
// should log: [5, 10, 15, 88, 1, 7, 100]

Ответы [ 3 ]

0 голосов
/ 15 декабря 2018

Просто еще одно решение, сохраняющее исходную сигнатуру функции, предоставленную OP:

function union(...arrays) {
    return Array.from(new Set([...arrays].flat()));
}

console.log(union([5, 10, 15], [15, 88, 1, 5, 7], [100, 15, 10, 1, 5]));

Или, еще короче (но менее удобное для чтения):

return [...(new Set([...arrays].flat()))];

Объяснение:

  • Array.from принимает Iterable в качестве аргумента, это создаст новый массив из исходного.
  • [...arrays] распространяетмассивы (аргумент) в новый, одиночный, один (Таким образом, он становится массивом массивов) -> [5, 10, 15], [15, 88, 1, 5, 7], [100, 15, 10, 1, 5] становится: [[5, 10, 15], [15, 88, 1, 5, 7], [100, 15, 10, 1, 5]]
  • .flat сглаживает массив, делая массив значений довольночем массив массивов значений -> https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat -> [[5, 10, 15], [15, 88, 1, 5, 7], [100, 15, 10, 1, 5]] становится [5, 10, 15, 15, 88, 1, 5, 7, 100, 15, 10, 1, 5]
  • new Set удаляет дубликаты из массива и возвращает Iterable https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set. ->[5, 10, 15, 15, 88, 1, 5, 7, 100, 15, 10, 1, 5] становится экземпляром Set (итерируемым) без дубликатов.Затем Array.from преобразует Set (Iterable) в обычный массив.Дополнительная информация здесь: Как преобразовать Set в Array?

ВНИМАНИЕ: Array.flat в настоящее время является экспериментальной функцией (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat). Решение без использования плоских значений ниже:

function union(...arrays) {
    return Array.from(new Set([].concat.apply([],[...arrays])));
}

console.log(union([5, 10, 15], [15, 88, 1, 5, 7], [100, 15, 10, 1, 5]));

Пояснение (только отличия от вышеуказанных):

  • Вместо .flat мы применяем к Array.concat наш исходный массив, чтобы он сгладил его, передав новый массивв качестве this и предоставления нашего массива в качестве аргумента: [].concat.apply([],[...arrays])

Фрагмент: http://jsfiddle.net/briosheje/y03osape/2/

Фрагмент без .flat: http://jsfiddle.net/briosheje/y03osape/4/

0 голосов
/ 15 декабря 2018

Я попытался скопировать ваш подход к циклическому изменению массивов, но более эффективным способом, используя только безопасные функции ES5.Я уверен, что другие ответы более эффективны, если вы можете использовать функции, которые они делают.

var a = [1, 2, 3];
var b = [1, 2, 4, 5];
var c = [2, 7, 9];

// takes an array of arrays
function getUnique(input) {

  var unique = [];

  // loop over each array
  input.forEach(function(item) {
    // loop over each value
    item.forEach(function(value) {
      // if it's not already in the unique array,
      if (unique.indexOf(value) == -1) {
        // add it
        unique.push(value);
      }
    });
  });

  return unique;
}

// takes an array of arrays
function getIntersection(input) {

  // assume all elements in first array are common
  var intersection = input.shift();
  var remove = [];

  // loop over items in first array and attempt to
  // disprove commonality
  intersection.forEach(function(value) {

    // loop over subsequent arrays
    for (var i = 0; i < input.length; i++) {
      var item = input[i];
      // if these arrays don't contain the value, 
      // then it isn't an intersection
      if (item.indexOf(value) == -1) {
        // add it to an array to be removed
        remove.push(value);
        // exit this loop
        break;
      }
    }
  });

  // remove values determined not to be intersections
  remove.forEach(function(value) {
    intersection.splice(intersection.indexOf(value), 1);
  })

  return intersection;
}


var test = getUnique([a, b, c]);

console.log(test);

var test2 = getIntersection([a, b, c]);

console.log(test2);
0 голосов
/ 15 декабря 2018

использовать установить это очень просто,

Объект Set позволяет хранить уникальные значения любого типа, будь то примитивные значения или объект

var a=  [5, 10, 15];
var b=[15, 88, 1, 5, 7];
var c=[100, 15, 10, 1, 5];
var result= [...new Set([...a, ...b,...c])];
console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...