Временная шкала Facebook: Javascript перебирает несколько массивов и выводит их все в шахматном порядке - PullRequest
1 голос
/ 07 июля 2019

Я пытаюсь создать что-то похожее на временную шкалу Facebook, я хочу выводить много разных видов постов, но я не хочу, чтобы они были одинаковыми в каждом (n) посте.

Эта функцияВот очень хорошее представление о том, что я пытаюсь достичь, хотя вам нужно, чтобы у вас были фиксированные массивы

https://rosettacode.org/wiki/Loop_over_multiple_arrays_simultaneously#JavaScript

У меня будет 3 вида тестовых данных временной шкалы:

Array 1 - [["пользователю A просто понравился пользователь B"], ["пользователю B просто понравился ...."] ...]

Array 2 - [["пользовательC опубликовал обновление статуса "], [" пользователь A опубликовал обновление статуса ... "] ...]

Array 3 - [[" пользователь D опубликовал новый альбом "], [" пользовательC опубликовал новый альбом ... "] ...]

Array 4 - [[" пользователь D опубликовал новую рекомендацию "], [" пользователь B опубликовал новую рекомендацию "] ...]

... и т. Д. И т. П.

может быть любое количество того, что мы будем называть родительскими массивами, например Array 1, Array 2, Array 3, Array 4эти родительские массивы будут содержать сами массивы, а иногда и многомерныеОднако для массивов меня заботит только организация родительских массивов:)

, поэтому в основном это должно следовать некоторому порядку, я не хочу, чтобы родительские массивы были организованы случайным образом (что значительно упростило бы ситуацию)

Вывод, который я хотел бы получить, заключается в том, чтобы Array 1 выводил каждый второй оборот (do-able with array1 % 2 == 0) со всеми остальными элементами массива, которые должны быть расположены в шахматном порядке, но что если мы исчерпаем элементы массива 1, пока есть большедругие, ну, я хочу, чтобы они просто продолжали выводить, пока, возможно, новый элемент не будет введен в массив 1

1 Ответ

1 голос
/ 07 июля 2019

Вот функция, которая перебирает эти массивы и берет следующее значение из следующего подмассива, который все еще имеет следующее значение, и добавляет его в массив результатов (который он вернет):

const mix = (all) =>
    Array.from({length: Math.max(...all.map(arr => arr.length))}, (_, i) => 
        all.map(arr => arr[i]).filter(Boolean)
    ).flat(2);

// Sample data
const all = [
    [ ["user A just liked user B"], ["User B just liked user C"]],
    [ ["user C posted a status update"], ["user A posted a status update"], ["user B posted a status update"]],
    [ ["user D posted a new album"], ["user C posted a new album"]],
    [ ["user D posted a new recommendation"], ["user B posted a new recommendation"], ["user A posted a new recommendation"], ["user C posted a new recommendation"]]
];

console.log(mix(all));

Итак, вот что происходит:

  1. Найти длину массива, в котором больше всего элементов
  2. Создатьновый массив этой длины и для каждой записи i выполните шаги 3 и 4, чтобы заполнить его (новым вложенным массивом):
  3. Создайте новый массив, который состоит из столько же значений, сколько имеетсяявляются массивами на входе.Для каждого соберите из него элемент i th .
  4. Извлеките значения undefined, собранные на предыдущем шаге.
  5. После шага2 завершает, выравнивает результирующий массив.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...