Слияние вложенных массивов в 1 массив
Приветствую всех! Есть одна задача имеется массив x =[[1,2,3],[[4],[5,[6,7],[8,9]],10]] нужно написать ф-цию которая вернёт y=[1,2,3,4,5,6,7,8,9,10] . Вот мой код
var x =[[1,2,3],[[4],[5,[6,7],[8,9]],10]], y = []; function arrMergeRecursive(arr) { for (item in arr) { if (typeof(item) === "number") { y.push(item); } else if (typeof(item) === "object") arrMergeRecursive(arr.findIndex(item)); } return console.log(y); } arrMergeRecursive(x) Решил эту же задачку на Python-е а на JavaScript не как не могу :( Подозреваю что в рекурсивной ф-ции неправильно ссылаю на вложеный элемент и в итоге не получаю typeof(item) === "number" . Искал помощи в решении везде :help: в т.ч. на StackOverflow. Буду рад если просто натолкнёте меня на решение. Спасибо. |
Patron,
var x =[[1,2,3],[[4],[5,[6,7],[8,9]],10]]; function arrMergeRecursive(arr) { var temp = []; for (var i=0; i<arr.length; i++) { var item = arr[i]; typeof(item) === "object" ? temp = temp.concat(arrMergeRecursive(item)) : temp.push(item) } return temp; } alert(JSON.stringify(arrMergeRecursive(x))); |
x.toString().split(',') |
Хммм, я и не предполагал возможности таких решений, огромное спасибо всем! Я хотел поэлементно собирать массив y.
|
Patron,
ну если строковое представление, затем разбить, то элементами массива будут не числа, подойдет ли такое, если нет, нужно преобразование. |
|
Paguo-86PK,
:blink: |
laimas,
Я понял т.е. получается не тру массив намберов а строка. Но её легко сделать массивом намберов. В принципе, да пойдёт вполне адекваткное решение имхо. |
Цитата:
var x =[[1,2,3],[[4],[5,[6,7],[8,9]],10]], y = x.toString().split(',').map(function(v) { return +v }); console.log(y) |
laimas,
А можно узнать что значит массив строковых представлений? Что это за строковые представления? Я запустил код без JSON и sringify() на выходе прировнял вызов функции y-ку проверил тип второго элемента y[1] - получил в ответ "number". |
Ааа всё понял прошу прощения за оплошность я код рони запустил сейчас запущу тот что короче :)
|
Ну это будут не 1, 2, 3, ... в массиве, а "1", "2", "3", ..., то есть строковый тип данных. Если в дальнейшем потребуется сложение элементов массива, то 1 + 2 = 3, а вот "1" + "2" = "12".
|
Всем Большое спасибо за ответы! Ответы реально классные!
|
laimas,
Я понял ты написал ф-цию которая возвращает эту же строку с унарным плюсом тем самым делающую строковое представление намбером и применил мэп чтоб пройтись по массиву. Мощное решение. Спасибо за ответы. |
Цитата:
|
var arr = [[1,2,3],[[4],[5,[6,7],[8,9]],10]]; var i = 10; while(i--) arr = Array.prototype.concat.apply([], arr); alert(JSON.stringify(arr)); |
Ruslan_xDD,
Цитата:
|
Ruslan_xDD,
:) var arr = [[1,2,3],[[4],[5,[6,7],[8,9]],10]]; function fn(a) { for (; a.length != (a = [].concat.apply([], a)).length;); return a }; alert(JSON.stringify(fn(arr))); |
:)
вариант с рекурсией var arr = [[1,2,3],[[4],[5,[6,7],[8,9]],10]]; function fn(b) { var a = [].concat.apply([], b); return b.length != a.length ? fn(a) : a }; alert(JSON.stringify(fn(arr))); |
console.log(JSON.parse("[" + [[1,2,3],[[4],[5,[6,7],[8,9]],10]].toString() + "]")) |
без вспомогательных массивов и сериализаций:
function arrMergeRecursive(arr, result) { for (var i = 0; i < arr.length; ++i) { Array.isArray(arr[i]) ? arrMergeRecursive(arr[i], result) : result.push(arr[i]); } return result; } |
Цитата:
var arr = [[1,2,3],[[4],[5,[6,7],[8,9]],10]]; while(arr.length !== (arr = Array.prototype.concat.apply([], arr)).length); alert(JSON.stringify(arr)); let arr = [[1,2,3],[[4],[5,[6,7],[8,9]],10]]; const fn = a => { while(a.length !== (a = [].concat(...a)).length); return a } alert(JSON.stringify(fn(arr))); |
|
Часовой пояс GMT +3, время: 04:57. |