Порядок по отдельным элементам в Javascript - PullRequest
0 голосов
/ 04 июня 2018

У меня есть массив элементов

Ввод

{
       "a":[1,2,3],
       "b":[4,5,6],
       "c":[7,8,9]
};

Я хочу получить элементы по одному от каждой клавиши.

Ожидаемый результат:

[1,4,7,2,5,8,3,6,9]

Я попытался выполнить следующее, но потерпел неудачу в нескольких различных примерах:

let obj = {
   "a":[1,2,3],
   "b":[4,5,6],
   "c":[7,8,9]
};
let arr = [];

for(let i in obj){
   arr.push(obj[i]);
}

let res = [];
for(let i=0;i<arr.length;i++){
   for(let j=0;j<arr[0].length;j++){
     res.push(arr[j][i]);
   }
}
console.log(res);

Приведенный выше код не работает в следующем примере:

{
       "a":[1,2,3]
};

Ошибка: не удается найти 0 из неопределенных.

{
"a": [1,2,3],
"b": [4,5,6,7]
}

7 отсутствует в выводе.

Каково лучшее решение для вышеуказанной проблемы.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Это был бы еще один легкий подход.

var arr = {
       "a":[1,2,3],
       "b":[4,5,6],
       "c":[7,8,9]
};

var values = Object.values(arr); //Using this will modify the original object during the process

//In case, original object should not be modified during the process use the following
//var values = Object.values(arr).map(function(elem){return elem.slice();});

var result = [];

while(values.length)
{
    values = values.filter(function(arr,index){ return arr.length; }); //Remove the empty arrays
    result = result.concat(values.map(function(elem){ return elem.shift(); })); //Get the first element of all arrays
}

console.log(result);
0 голосов
/ 04 июня 2018

Вы можете найти максимальную длину, используя Math.max и map каждый массив.

let obj = {
  "a": [1, 2, 3],
  "b": [4, 5, 6, 7]
}

//Convert the object into multi dimentional array
let arr = Object.values(obj);
let res = [];


for (i = 0; i < Math.max(...arr.map(o => o.length)); i++) {  //Loop from 0 to the legnth of the longest array
  for (x = 0; x < arr.length; x++) {                         //Loop each array
    if (arr[x][i]) res.push(arr[x][i]);                      //If element exist, push the array
  }
}

console.log(res);
...