Как сделать массив плоским в 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?
Как проверить, пустой ли массив или существует?
Получить индекс объекта в массиве, соответствующего условию
Как перенаправить на другую веб-страницу?