0

Как сделать массив плоским в jQuery?

44

Вопрос: Как просто "сплюснуть" массив в jQuery?

У меня есть следующий массив:

[1, 2, [3, 4], [5, 6], 7]

И я хотел бы получить результат в виде:

[1, 2, 3, 4, 5, 6, 7]

Какова простейшая процедура для "сплющивания" массива с использованием jQuery? Спасибо!

5 ответ(ов)

0

Вы можете использовать метод 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.

0

Ваш код для функции flatten действительно выполняет задачу "выравнивания" вложенного массива a, и его не нужно дополнительно подключать, например, jQuery. Функция рекурсивно проходит через все элементы массива и добавляет их в новый массив b, сохраняя при этом порядок.

Вот как это работает:

  1. Функция flatten принимает два аргумента: массив e, который необходимо выровнять, и массив b, в который будут добавлены "выравненные" элементы.
  2. С помощью проверки typeof e.length != "undefined" определяется, является ли текущий элемент массивом.
  3. Если это массив, то функция рекурсивно вызывает себя для каждого элемента этого массива.
  4. Если это не массив, то элемент добавляется в массив b с помощью метода push.

Вы можете просто скопировать этот код в консоль вашего браузера (например, Firebug в Firefox или DevTools в Chrome) и запустить его. Результат будет выведен в консоль:

// Выводит: [1, 2, 3, 4, 5, 6, 7, 8]
console.log(b);

Таким образом, ваша функция успешно справляется с задачей, и не требует сторонних библиотек.

0

Ваш код для глубокого выравнивания массива выглядит хорошо и использует рекурсию для обработки нескольких уровней вложенности. Позвольте мне объяснить, как он работает.

Функция flaten принимает два аргумента: flatened (выравненный массив, куда будут помещены элементы) и arr (входящий массив, который нужно выровнять).

Вот шаги, которые выполняет функция:

  1. С помощью цикла for перебираются все элементы массива arr.
  2. Для каждого элемента проверяется, является ли он объектом (в JavaScript массивы также считаются объектами). Если это не объект, элемент добавляется в массив flatened с помощью метода push.
  3. Если элемент - это объект (массив), происходит рекурсивный вызов функции flaten с текущим элементом в качестве нового массива. Это позволяет обработать вложенные массивы на любом уровне.
  4. Функция завершает свою работу, когда все элементы массива 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]

В результате выравнивания вы получаете однородный массив, содержащий все элементы из вложенных массивов.

Если у вас есть дополнительные вопросы по поводу этого кода или его оптимизации, не стесняйтесь задавать!

0

Вы можете использовать метод 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 для объединения текущего элемента с аккумулятором. В итоге мы получаем плоский массив, который выводится в консоль.

0

Старый вопрос, знаю, но...

Я нашел, что этот метод работает и достаточно быстр:

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

Этот подход проще и эффективнее для современных браузеров.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь