我可以将map函数与2个数组一起使用吗?

时间:2019-06-25 11:10:49

标签: javascript arrays dictionary zipwith

我想知道是否存在可以执行类似操作的功能

我已经尝试过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 个答案:

答案 0 :(得分:2)

以下是flatMap的示例:

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

console.log(arr1.flatMap((x,i) =>[x, arr2[i]]))

答案 1 :(得分:1)

由于您似乎已经在使用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>

答案 2 :(得分:0)

由于它们都具有相同数量的项目,因此您可以使用array1遍历mapmap回调的第二个参数是索引。您可以使用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)