Объединить два массива, которые включают нуль и элемент объекта? - PullRequest
0 голосов
/ 11 марта 2019

Если у меня есть два массива javascript.

const a = [null,null,{a:1}];
const b = [{c:3},null,{a:3,b:2}];

Мне нужна функция, которая может возвращать следующий результат.

[{c:3},null,{a:3,b:2}]

И вышесказанное все еще может применяться к следующему.

const a = [];
const b = [null,null,{t:4}];

Я хочу получить следующий результат.

[null,null,{t:4}]

Может кто-нибудь мне помочь? Спасибо!

Ответы [ 5 ]

3 голосов
/ 11 марта 2019

Похоже, вы хотите объединить те объекты, которые имеют одинаковый индекс во входных массивах:

function merge(a, b) {
    const merged = [];
    for (let i = 0; i < a.length || i < b.length; i++) {
        merged.push(a[i] && b[i] ? {...a[i], ...b[i]} : a[i] || b[i]);
    }
    return merged;
}

console.log(merge([null,null,{a:1}], [{c:3},null,{a:3,b:2}]));
console.log(merge([], [null,null,{t:4}]));
2 голосов
/ 11 марта 2019

Вы можете объединить элементы, проверив также ложное значение.

const
    merge = (...a) => a.reduce(
        (r, a) => (a.forEach((o, i) => r[i] = o || r[i] || !r[i] && o), r),
        []
    );

console.log(merge([null, null, { a: 1 }], [{ c: 3 }, null, { a: 3, b: 2 }]));
console.log(merge([], [null, null, { t: 4 }]));
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 11 марта 2019

Мне нравится разбивать обработку на две части:

const zipWith = (fn) => (a, b) => [...Array(Math.max(a.length, b.length))]
  .map((_, i) => fn(a[i], b[i]))

const combine = zipWith ((a, b) => 
  a && b ? {...a, ...b} : a ? {...a} : b ? {...b} : null)

console.log(combine([null, null, {a: 1}], [{c: 3}, null, {a: 3, b: 2}]))
console.log(combine([], [null, null, {t: 4}]))
.as-console-wrapper { max-height: 100% !important; top: 0; }

"zip" - это общее имя для функции, которая объединяет два массива, индекс за индексом. Иногда «zipWith» используется для расширения, которое принимает функцию для решения, как объединить эти два значения. Эта версия zipWith немного сложнее, чем другие варианты, поскольку в ней используется большая длина двух входных массивов, а не только длина первого (которая может быть записана zip = (fn) => (a1, a2) => a1.map((a, i) => fn(a, a2[i])).)

combine вызывает это с помощью функции, которая обрабатывает четыре случая: a null / b null, a null / b non-null, a non-null / b null и a non-null / b non-null, используя или комбинируя предоставленные значения.

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

1 голос
/ 11 марта 2019

Оператор Concat или Spread должен сделать это ..

const a1 = [];
const b1 = [null,null,{t:4}];
const result1 = [...a1, ...b1];
console.log(result1);

const a2 = [null,null,{a:1}];
const b2 = [{c:3},null,{a:3,b:2}];
const result2 = [...a2, ...b2];
console.log(result2);
1 голос
/ 11 марта 2019

const a = [];
const b = [null,null,{t:4}];

const c = [...a, ...b];

console.log(c);

Как насчет использования оператора spread ?

Вы также можете использовать concat метод для объединения двух массивов, например

const a = [];
const b = [null,null,{t:4}];

const c = a.concat(b);
console.log(c)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...