重新排列数组

时间:2018-10-23 16:56:11

标签: javascript arrays

我需要以特定的方式重新排列数组。

我的输入数组结构是这样的(编辑):

  [
    [[elem1-1,elem1-2,elem1-3],int1],
    [[elem2-1,elem2-2,elem2-3],int2]
  ]

解释:“ elem [n-n]”表示元素,“ int [n]”是整数。

使用上述结构使我在2个级别中编写了一个非常复杂的循环以获取数据,并且需要重新排列相同的数组以使其看起来像这样,并避免出现第二个循环:

  [
    [elem1-1,int1],
    [elem1-2,int1],
    [elem1-3,int1],
    [elem2-1,int2],
    ...
  ]

数组之间的主要区别是第二个数组的所有元素都在行中,并重复输入内联元素的int值。

关键是我想不使用任何foreach指令就重新排列此数组(这将导致相同的2级循环),只需使用map,reduce等即可。

我尝试了数组映射,但是仍然无法正常工作。参见下面的代码:

      //arr_in is the first array structure and arr_out is my expected output
      var arr_out = arr_in.map( function (elem){
        if (elem[0].size()>1) {
          return [//here is the problem, i guess]
        }
        else {
          return [elem[0], elem[1]]
        }
      });

预先感谢

2 个答案:

答案 0 :(得分:1)

根据提供的代码,我猜测arr_in是一个二维数组,其中包含以下形式的数组:[elem1-1, elem1-2, ..., int1]。如果是这样,那么在数组及其子元素上的forEach将起作用:

var arr_out = [];
arr_in.forEach( function (sub) {
  // sub = sub.slice(0);                    // uncomment this line if you don't want to alter the original array arr_in
  var int = sub.pop();                      // get the last item of this sub array, which is the "int"
  sub.forEach(function(elem) {              // for each other element left in the sub array
    arr_out.push([elem, int]);              // push a pair to the result array consisting of the current element and the "int"
  });
});

使用箭头功能可以缩短:

let arr_out = [];
arr_in.forEach( sub => {
  let int = sub.pop();
  sub.forEach(elem => arr_out.push([elem, int]));
});

如果您想使用更多功能,可以随时使用reduce

let arr_out = arr_in.reduce((acc, sub) => {
  let int = sub.pop();
  sub.forEach(elem => acc.push([elem, int]));
  return acc;
}, []);

演示:

var arr_in = [
  ["elem1", "elem2", "elem3", 7],
  ["elem1", 5],
  ["elem1", "elem2", 9]
];

let arr_out = [];
arr_in.forEach( sub => {
  let int = sub.pop();
  sub.forEach(elem => arr_out.push([elem, int]));
});

console.log(arr_out);

答案 1 :(得分:-1)

您可以通过映射内部数组或在索引为奇数的情况下仅返回最后一个结果来简化数组。

var array = [[['elem1-1','elem1-2','elem1-3'], 'int1'], [['elem2-1','elem2-2','elem2-3'], 'int2']],
    result = array.reduce(
        (r, [a, b]) => r.concat(a.map(v => [v, b])),
        []
    );

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }