Эффективное объединение двух массивов за счет равномерного распределения значений - PullRequest
1 голос
/ 14 июля 2020

Я видел много вопросов / ответов, связанных с объединением двух массивов с чередованием значений. они работают следующим образом:

let array1 = ["a", "b", "c", "d"];
let array2 = [1, 2];

let outcome = ["a",1 ,"b", 2, "c", "d"] 

, но я хочу, чтобы вывод был более эффективным с равномерным распределением значений в зависимости от размера массива.

expected outcome = ["a","b", 1, "c", "d", 2] 

другой сценарий

let array2 = [1];
expected outcome = ["a","b", 1, "c", "d"] 

как лучше всего добиться такого слияния?

Ответы [ 4 ]

1 голос
/ 14 июля 2020

Идея состоит в том, чтобы выяснить, на сколько элементов длинного массива вам придется смешивать элемент из короткого массива. Приведенный ниже код демонстрирует концепцию. Возможно, вам придется немного отрегулировать его для всех сценариев краев ios.

let array1 = ["a", "b", "c", "d"];
let array2 = [1, 2];


//Get the long and short arrays and calc the length factor
var [longArray, shortArray] = array1.length >= array2.length ? [array1, array2] : [array2, array1];
let lengthFactor = longArray.length / shortArray.length;


var c = 0
let smallIdx = 0;
let result = longArray.flatMap(item => {

  c++;
  
  if (c % lengthFactor === 0) {
    return [item, shortArray[smallIdx++]]
  }
  else
    return [item];    
})


console.log(result);
1 голос
/ 14 июля 2020

Найдите отношение длин двух массивов, longest.length/shortest.length, а затем возьмите это количество из самого длинного для каждого из самых коротких.

let array1 = ["a", "b", "c", "d", "e"];
let array2 = [1, 2];

const evenDistribute = (array1, array2) => {
  const longest = array1.length > array2.length ? array1 : array2;
  const shortest = array1.length > array2.length ? array2 : array1;
  const ratio = Math.floor(longest.length / shortest.length);
  const results = [];
  for (let i = 0; i < shortest.length; i++) {
    for (let j = 0; j < ratio; j++) {
      results.push(longest[i * ratio + j]);
    }
    results.push(shortest[i]);
  }
  // Grab any that are left over
  for (let i = longest.length - (longest.length % shortest.length); i < longest.length; i++) {
    results.push(longest[i]);
  }
  return results;
}

console.log(evenDistribute(array1, array2));
0 голосов
/ 14 июля 2020

let array1 = ['a', 'b', 'c', 'd', 'e'];
let array2 = [1, 2];

function merge(arr1, arr2) {
    let newArr1 = JSON.parse(JSON.stringify(arr1));
    let newArr2 = JSON.parse(JSON.stringify(arr2));
    [newArr1, newArr2] = newArr1.length >= newArr2.length ? [newArr1, newArr2] : [newArr2, newArr1];
    const interval = newArr1.length / newArr2.length;
    newArr2.map((item, index) => {
        newArr1.splice(interval * (index + 1), 0, item);
    })
    return newArr1;
}
console.log(merge(array1, array2));
0 голосов
/ 14 июля 2020

Вы можете получить интервал для распределения. Затем l oop через второй массив и используйте splice для обновления определенных c индексов первого массива.

function distribute(original, replace) {
  const interval = Math.ceil(original.length / (replace.length + 1));
  replace.forEach((r, i) => original.splice(interval * (i + 1) + i, 0, r))
  console.log(...original)
}

distribute(["a", "b", "c", "d"], [1])
distribute(["a", "b", "c", "d"], [1, 2])
distribute(["a", "b", "c", "d"], [1, 2, 3])
distribute(["a", "b", "c", "d", "e", "f"], [1, 2])
distribute(["a", "b", "c", "d", "e", "f"], [1, 2, 3])
...