Как сделать массив плоским в jQuery?
Вопрос: Как просто "сплюснуть" массив в jQuery?
У меня есть следующий массив:
[1, 2, [3, 4], [5, 6], 7]
И я хотел бы получить результат в виде:
[1, 2, 3, 4, 5, 6, 7]
Какова простейшая процедура для "сплющивания" массива с использованием jQuery? Спасибо!
5 ответ(ов)
Вы можете использовать метод Array.prototype.concat
вместе с apply
, чтобы "развернуть" вложенные массивы в один плоский массив. В вашем примере:
var a = [[1, 2], 3, [4, 5]];
console.log(Array.prototype.concat.apply([], a));
// выведет [1, 2, 3, 4, 5]
Здесь apply
позволяет передать a
как аргументы в метод concat
. Пустой массив []
используется как начальное значение, в которое будут добавлены элементы из вложенных массивов. В результате вы получаете один плоский массив, содержащий все элементы из массива a
.
Ваш код для функции flatten
действительно выполняет задачу "выравнивания" вложенного массива a
, и его не нужно дополнительно подключать, например, jQuery. Функция рекурсивно проходит через все элементы массива и добавляет их в новый массив b
, сохраняя при этом порядок.
Вот как это работает:
- Функция
flatten
принимает два аргумента: массивe
, который необходимо выровнять, и массивb
, в который будут добавлены "выравненные" элементы. - С помощью проверки
typeof e.length != "undefined"
определяется, является ли текущий элемент массивом. - Если это массив, то функция рекурсивно вызывает себя для каждого элемента этого массива.
- Если это не массив, то элемент добавляется в массив
b
с помощью методаpush
.
Вы можете просто скопировать этот код в консоль вашего браузера (например, Firebug в Firefox или DevTools в Chrome) и запустить его. Результат будет выведен в консоль:
// Выводит: [1, 2, 3, 4, 5, 6, 7, 8]
console.log(b);
Таким образом, ваша функция успешно справляется с задачей, и не требует сторонних библиотек.
Ваш код для глубокого выравнивания массива выглядит хорошо и использует рекурсию для обработки нескольких уровней вложенности. Позвольте мне объяснить, как он работает.
Функция flaten
принимает два аргумента: flatened
(выравненный массив, куда будут помещены элементы) и arr
(входящий массив, который нужно выровнять).
Вот шаги, которые выполняет функция:
- С помощью цикла
for
перебираются все элементы массиваarr
. - Для каждого элемента проверяется, является ли он объектом (в JavaScript массивы также считаются объектами). Если это не объект, элемент добавляется в массив
flatened
с помощью методаpush
. - Если элемент - это объект (массив), происходит рекурсивный вызов функции
flaten
с текущим элементом в качестве нового массива. Это позволяет обработать вложенные массивы на любом уровне. - Функция завершает свою работу, когда все элементы массива
arr
обработаны.
Ваша основная часть кода:
a = [1, [4, 2], [2, 7, [6, 4]], 3];
b = [];
flaten(b, a);
console.log(b); // Вывод: [1, 4, 2, 2, 7, 6, 4, 3]
В результате выравнивания вы получаете однородный массив, содержащий все элементы из вложенных массивов.
Если у вас есть дополнительные вопросы по поводу этого кода или его оптимизации, не стесняйтесь задавать!
Вы можете использовать метод Array.prototype.reduce
, который технически не является jQuery, но является валидным ES5. Вот пример кода:
var multidimensionArray = [1, 2, [3, 4], [5, 6], 7];
var initialValue = [];
var flattened = multidimensionArray.reduce(function(accumulator, current) {
return accumulator.concat(current);
}, initialValue);
console.log(flattened);
Этот код проходит по многомерному массиву и объединяет его элементы в один плоский массив. Метод reduce
принимает два аргумента: функцию обратного вызова и начальное значение аккумулятора. Внутри функции обратного вызова мы используем concat
для объединения текущего элемента с аккумулятором. В итоге мы получаем плоский массив, который выводится в консоль.
Старый вопрос, знаю, но...
Я нашел, что этот метод работает и достаточно быстр:
function flatten(arr) {
b = Array.prototype.concat.apply([], arr);
if (b.length != arr.length) {
b = flatten(b);
};
return b;
}
Этот код использует Array.prototype.concat
для слияния массива и рекурсивно продолжает сглаживание, пока длина результирующего массива не станет равной длине исходного. Это гарантирует, что все вложенные массивы будут расправлены. Однако обратите внимание, что такая реализация может привести к переполнению стека при обработке очень глубоких вложенных массивов. В качестве альтернативы вы можете рассмотреть использование метода flat
, который появился в ES2019 и может сделать это без рекурсии:
const flatten = arr => arr.flat(Infinity);
Этот подход проще и эффективнее для современных браузеров.
Слияние/выпрямление массива массивов
Как узнать, содержится ли определенная строка в массиве на JavaScript/jQuery?
Как проверить, пустой ли массив или существует?
Получить индекс объекта в массиве, соответствующего условию
Как перенаправить на другую веб-страницу?