Преобразовать двумерный массив в одномерный массив, чередуя их значения - PullRequest
0 голосов
/ 24 мая 2018

У меня есть двумерный массив, подобный этому:

let test2d = [
  ["foo", "bar"],
  ["baz", "biz"]
]

Если я хочу преобразовать этот 2D-массив в одномерный массив (, не чередуя их значения ),Я могу сделать это двумя способами:

Первый способ:

let merged = test2d.reduce( (prev, next) => prev.concat(next) )
console.log(merged) // ["foo", "bar", "baz", "biz"]

Второй способ:

let arr1d = [].concat.apply([], test2d)
console.log(arr1d) // ["foo", "bar", "baz", "biz"]

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

["foo", "baz", "bar", "biz"]

Ответы [ 4 ]

0 голосов
/ 24 мая 2018

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

var data = [];  // This will be the new array
let test2d =    // This is your 2D array
[  
  ["foo", "bar"],
  ["baz", "biz"]
]

// Here we use nested for-loops to add the items to data[] in the desired order
for(var i = 0; i < test2d.length; i++) {
    for(var j = 0; j < test2d[0].length; j++) {
        data.push(test2d[j][i]);
    }
}

console.log(data); // Print the output :)

Массив data теперь равен: [ "foo", "baz", "bar", "biz" ]

Надеюсь, это полезно!

0 голосов
/ 24 мая 2018

Вы можете взять массив для каждого индекса и объединить массивы в конце.

var array = [["foo", "bar"], ["baz", "biz"]],
    result = [].concat(...array.reduce((r, a) => {
        a.forEach((v, i) => (r[i] = r[i] || []).push(v));
        return r;
    }, []));

console.log(result);
0 голосов
/ 24 мая 2018

Почему бы не использовать обычный цикл for?Это эффективно и легко читать.

var arr1d = [];
for (let i = 0; i < test2d[0].length; i++) {
    for (let j = 0; j < test2d.length; j++) {
        arr1d.push(test2d[j][i]);
    }
}
0 голосов
/ 24 мая 2018

Вы можете использовать функцию zip, определенную здесь: Javascript-эквивалент функции zip Python

let zip= rows => rows[0].map((_,c)=>rows.map(row=>row[c]))

Таким образом, вы можете вызвать:

let arr1d = [].concat.apply([], zip(test2d))

Вотполный код:

let test2d = [ ["foo", "bar"], ["baz", "biz"] ]

let zip = rows => rows[0].map((_, c) => rows.map(row => row[c]))

let arr1d = [].concat.apply([], zip(test2d))

console.log(arr1d)
...