Мне нужно изменить порядок массива определенным образом.

Моя структура входного массива выглядит так (отредактировано):

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

Объяснение: «elem [n-n]» означает элемент, а «int [n]» - целое число.

Использование приведенной выше структуры заставляет меня написать очень сложный цикл на двух уровнях для получения моих данных, и мне нужно изменить порядок того же массива, чтобы он выглядел так, и избежать второго цикла:

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

Основное различие между массивами заключается в том, что второй имеет все элементы в строке и повторяет значение int для входных встроенных элементов.

Дело в том, что я хочу переставить этот массив без использования каких-либо инструкций foreach (что приведет к тому же двухуровневому циклу), просто используя 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]]
        }
      });

Заранее спасибо

-3
danielarend 23 Окт 2018 в 19:56

2 ответа

Лучший ответ

Я предполагаю, основываясь на предоставленном коде, что 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
ibrahim mahrir 23 Окт 2018 в 17:28

Вы можете уменьшить массив, сопоставив внутренний массив или вернув только последний результат, если индекс нечетный.

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; }
0
Nina Scholz 23 Окт 2018 в 18:34
52954245