Могу ли я использовать функцию карты с 2 массивами? - PullRequest
3 голосов
/ 25 июня 2019

Мне было интересно, существует ли какая-либо функция, которая может делать что-то подобное

Я уже пробовал zipWith и некоторые варианты карты, но безрезультатно.Единственное рабочее решение для этого - 2x ForEach, но мне было интересно, могу ли я минимизировать это до одной функции

_.map( (array1, array2), function(knownValue, indexOfArray1, indexOfArray2) );

Что мне нужно, это увеличить индексы array1 и array 2 одновременно (например: a1: 1, a2: 1; a1: 2, a2: 2; ...).

У этих массивов есть и другие типы значений

@ EDIT

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

_.map( (array1, array2), (valueOfArray1, valueOfArray2), someFunction(knownValue, valueOfArray1, valueOfArray2) );

Итак, я намерен: для элементов array1 и array2 выполнить функцию "someFunction" и в следующем приращении использовать следующий элементкаждого массива.

Как:

_.map( (array1, array2), (array1[0], array2[0]), someFunction(knownValue, array1[0], array2[0]) );

и далее

_.map( (array1, array2), (array1[1], array2[1]), someFunction(knownValue, array1[1], array2[1]) );

, но я хочу это более элегантно: P

PS (Извините заэтот беспорядок)

Ответы [ 3 ]

2 голосов
/ 25 июня 2019

Вот пример с flatMap:

const arr1 = [1,3,5];
const arr2 = [2,4,6];

console.log(arr1.flatMap((x,i) =>[x, arr2[i]]))
1 голос
/ 25 июня 2019

Поскольку вы, кажется, уже используете lodash (или что-то подобное), .zip должно работать. Единственный подводный камень в том, что .zip создает «пары» с одной из каждого исходного массива В новом массиве.

Поэтому, когда вы отображаете результат из .zip, первый аргумент - это массив. Смотрите пример ниже и обратите внимание, что я разрушаю первый аргумент с помощью

function([a1_item, a2_item], indexForBoth) { .. rest of function here }

const a1 = ['a', 'b', 'c'];
const a2 = ['One', 'Two', 'Three'];

const result = _.zip(a1, a2).map(function([a1_item, a2_item], indexForBoth) { 
  return a1_item + a2_item + indexForBoth;
});


console.log("a1", a1);
console.log("a2", a2);
console.log("a1 zipped with a2", _.zip(a1, a2) );

console.log("Result after mapping and concatinating", result);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>
0 голосов
/ 25 июня 2019

Поскольку у них обоих одинаковое количество предметов, вы можете просмотреть array1, используя map.Вторым параметром map callback является индекс.Вы можете использовать его для получения эквивалентного значения из array2, используя array2[index]

array1.map((value1, index) => someFunction(knownValue, value1, array2[index]))

. Это создает массив значений, возвращаемых someFunction для каждого индекса

Вот фрагмент кода снекоторые образцы данных.Здесь someFunction объединяет каждое значение с _ разделителем

const someFunction = (...values) => values.join('_')

const array1 = [1, 2, 3],
      array2 = [10, 20, 30],
      knownValue = "fixed";

const output = array1.map((value1, i) => someFunction(knownValue, value1, array2[i]))

console.log(output)
...