Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Слияние вложенных массивов в 1 массив (https://javascript.ru/forum/misc/69218-sliyanie-vlozhennykh-massivov-v-1-massiv.html)

Patron 06.06.2017 21:40

Слияние вложенных массивов в 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. Буду рад если просто натолкнёте меня на решение. Спасибо.

рони 06.06.2017 22:04

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)));

laimas 06.06.2017 22:08

x.toString().split(',')

Patron 06.06.2017 22:13

Хммм, я и не предполагал возможности таких решений, огромное спасибо всем! Я хотел поэлементно собирать массив y.

laimas 06.06.2017 22:16

Patron,
ну если строковое представление, затем разбить, то элементами массива будут не числа, подойдет ли такое, если нет, нужно преобразование.

Paguo-86PK 06.06.2017 22:18

merge?

рони 06.06.2017 22:22

Paguo-86PK,
:blink:

Patron 06.06.2017 22:27

laimas,
Я понял т.е. получается не тру массив намберов а строка. Но её легко сделать массивом намберов. В принципе, да пойдёт вполне адекваткное решение имхо.

laimas 06.06.2017 22:29

Цитата:

Сообщение от Patron
т.е. получается не тру массив намберов а строка

нет, это будет массив строковых представлений чисел исходного массива. Если сразу с преобразованием, то так:

var x =[[1,2,3],[[4],[5,[6,7],[8,9]],10]],
    y = x.toString().split(',').map(function(v) {
        return +v
    });
console.log(y)

Patron 06.06.2017 22:37

laimas,
А можно узнать что значит массив строковых представлений? Что это за строковые представления? Я запустил код без JSON и sringify() на выходе прировнял вызов функции y-ку проверил тип второго элемента y[1] - получил в ответ "number".

Patron 06.06.2017 22:39

Ааа всё понял прошу прощения за оплошность я код рони запустил сейчас запущу тот что короче :)

laimas 06.06.2017 22:41

Ну это будут не 1, 2, 3, ... в массиве, а "1", "2", "3", ..., то есть строковый тип данных. Если в дальнейшем потребуется сложение элементов массива, то 1 + 2 = 3, а вот "1" + "2" = "12".

Patron 06.06.2017 22:49

Всем Большое спасибо за ответы! Ответы реально классные!

Patron 06.06.2017 22:57

laimas,
Я понял ты написал ф-цию которая возвращает эту же строку с унарным плюсом тем самым делающую строковое представление намбером и применил мэп чтоб пройтись по массиву. Мощное решение. Спасибо за ответы.

laimas 06.06.2017 23:01

Цитата:

Сообщение от Patron
Я понял ты написал ф-цию

я не писал функций, это все уже есть готовое. :)

ruslan_mart 07.06.2017 01:21

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));

рони 07.06.2017 01:24

Ruslan_xDD,
Цитата:

Сообщение от Ruslan_xDD
var i = 10;

откуда?

рони 07.06.2017 01:36

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)));

рони 07.06.2017 01:50

:)
вариант с рекурсией
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)));

SV0L0CH 07.06.2017 10:00

console.log(JSON.parse("[" + [[1,2,3],[[4],[5,[6,7],[8,9]],10]].toString() + "]"))

Alexandroppolus 07.06.2017 16:01

без вспомогательных массивов и сериализаций:
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;
}

ruslan_mart 07.06.2017 16:49

Цитата:

Сообщение от рони
откуда?

Это типа вручную уровень вложенности указываем :)


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)));

nerv_ 07.06.2017 21:26

https://github.com/jfhbrook/node-flatten


Часовой пояс GMT +3, время: 04:57.