【问题标题】:How to combine 2 arrays into one by odd, even indexes with map or foreach如何使用 map 或 foreach 通过奇数、偶数索引将 2 个数组组合成一个
【发布时间】:2020-03-29 07:12:05
【问题描述】:

我有 2 个数组:

var keys = Object.keys(item); // [first, second, third, forth]
var values = Object.values(item); // [fifth, sixth, seventh, eighth]
let newArray = [];

输出应该是:

[first, fifth, second, sixth, third, seventh, forth, eighth]

是否可以不使用任何 while 循环,例如 for i in itemfor i = 0; i ..
只需使用地图、拼接等。

【问题讨论】:

  • 这能回答你的问题吗? map function for objects (instead of arrays)
  • 没有人......他们是不同的
  • @Daniyar 如果您实际上是在尝试从一个对象开始创建像[key, value, key, value] 这样的数组,那么该链接应该可以回答您的问题。如果您想在两个数组的一般情况下执行此操作,那么请删除您关于键和值的部分问题,因为它会使水变得混乱。

标签: javascript arrays functional-programming


【解决方案1】:

你可以这样做:

Object.entries(item).flat()

你的预期输出是

[key1, value1, key2, value2,...]

Object.entries() 返回一个二维数组,如下所示:[[key1, value1], [key2, value2],...]。您可以在此数组上使用 flat 来创建备用键值项数组

这是一个sn-p:

let item = {
  first: "fifth",
  second: "sixth",
  third: "seventh",
  forth: "eighth"
};

const output = Object.entries(item).flat()

console.log(output)

【讨论】:

  • 你在代码高尔夫上打败了我!我写了一个.map 函数,它基本上只是为我的答案做Object.entries
  • 如果它是一个嵌套的字典呢?
  • @yogeshmhetre 输出会是什么样子?根据这段代码,它仍然是一个键值链,但值将是对象。 OP 没有提到如何处理。
【解决方案2】:

你可以试试Array.prototype.forEach()

var keys = ['first', 'second', 'third', 'forth']
var values = ['fifth', 'sixth', 'seventh', 'eighth']
let newArray = [];
keys.forEach(function(el, i){
  newArray.push(el);
  if(values.length > i) newArray.push(values[i]);
});
console.log(newArray);

更新:最近注意到了keysvalues,在这种情况下无疑最好的选择是Object.entries()

Object.entries() 方法返回给定对象自己的可枚举字符串键属性 [key, value] 对的数组,与提供的顺序相同 for...in 循环(不同之处在于 for-in 循环也枚举原型链中的属性)。 Object.entries() 返回的数组的顺序与对象的定义方式无关。

还有Array.prototype.flat()

flat() 方法创建一个新数组,其中所有子数组元素递归连接到指定深度。

var arr = {'first':'fifth', 'second':'sixth', 'third':'seventh', 'forth':'eighth'};
let newArray = Object.entries(arr).flat();
console.log(newArray);

【讨论】:

  • 数组的第一个索引是0而不是1
  • functional-programming 标签表明用户正在寻找一个基于函数式编程原则的解决方案,我认为这里没有反映:forEach 作用于其范围之外的变量,它变异数据。查看您的编辑历史记录,entries() + flat() 建议正是 @adiga 之前建议的,所以我不确定这如何增加任何实质性内容。
【解决方案3】:
var item = {first:'fifth',second:'sixth',third:'seventh'};
var arr = Object.keys(item).map(k => [k, item[k]]).flat();
console.log(arr);

首先我创建一个二维数组[[first,fifth],[second,sixth]],然后用.flat() 将其展平

【讨论】:

  • 通过一层嵌套,您可以使用 flatMap 缩短它:Object.keys(item).flatMap(k => [k, item[k]])
猜你喜欢
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多