Вернуть n массивов

162
07 марта 2019, 03:00

Есть массив данных в котором может находиться не ограниченное кол-во объектов. Хочу написать функцию которая будет возвращать каждые 10 элементов массива. То есть первые 10 потом следующие 10 и т.д. По сути это обычная пагинация.

Мой пример не корректно работает, точнее возвращает но не совсем то что мне необходимо.

const demoDMS = [ 
  {id: 1, quantity: 6436}, 
  {id: 2, quantity: 3131}, 
  {id: 3, quantity: 23}, 
  {id: 4, quantity: 123}, 
  {id: 5, quantity: 3213}, 
  {id: 6, quantity: 322}, 
  {id: 7, quantity: 55}, 
  {id: 8, quantity: 334}, 
  {id: 9, quantity: 13}, 
  {id: 10, quantity: 1414}, 
  {id: 11, quantity: 22}, 
  {id: 12, quantity: 23}, 
  {id: 13, quantity: 424}, 
  {id: 14, quantity: 3232}, 
  {id: 15, quantity: 525}, 
  {id: 16, quantity: 222}, 
  {id: 17, quantity: 123}, 
  {id: 18, quantity: 3213}, 
  {id: 19, quantity: 4124}, 
  {id: 20, quantity: 132}, 
  {id: 21, quantity: 1234}, 
  {id: 22, quantity: 5325}, 
  {id: 23, quantity: 6462}, 
  {id: 24, quantity: 6472}, 
  {id: 25, quantity: 232}, 
  {id: 26, quantity: 5346}, 
  {id: 27, quantity: 5464}, 
  {id: 28, quantity: 12362}, 
  {id: 29, quantity: 8657}, 
  {id: 30, quantity: 9587} 
]; 
function rebaseDMSelements(page) { 
  const count = 10; 
  let data = demoDMS 
    .filter((i, index) => (page * count > index + 1 && index + 1 < page * count)) 
  if (page * count < demoDMS.length) { 
    this.rebaseDMSelements(page + 1) 
  } 
  console.log(`page number: ` + page, 'elements: ' + data.length) 
} 
 
rebaseDMSelements(1);

Answer 1

Если нужно получать страницы строго по порядку, то можно использовать генератор:

const demoDMS = [ 
  {id: 1, quantity: 6436}, 
  {id: 2, quantity: 3131}, 
  {id: 3, quantity: 23}, 
  {id: 4, quantity: 123}, 
  {id: 5, quantity: 3213}, 
  {id: 6, quantity: 322}, 
  {id: 7, quantity: 55}, 
  {id: 8, quantity: 334}, 
  {id: 9, quantity: 13}, 
  {id: 10, quantity: 1414}, 
  {id: 11, quantity: 22}, 
  {id: 12, quantity: 23}, 
  {id: 13, quantity: 424}, 
  {id: 14, quantity: 3232}, 
  {id: 15, quantity: 525}, 
  {id: 16, quantity: 222}, 
  {id: 17, quantity: 123}, 
  {id: 18, quantity: 3213}, 
  {id: 19, quantity: 4124}, 
  {id: 20, quantity: 132}, 
  {id: 21, quantity: 1234}, 
  {id: 22, quantity: 5325}, 
  {id: 23, quantity: 6462}, 
  {id: 24, quantity: 6472}, 
  {id: 25, quantity: 232}, 
  {id: 26, quantity: 5346}, 
  {id: 27, quantity: 5464}, 
  {id: 28, quantity: 12362}, 
  {id: 29, quantity: 8657}, 
  {id: 30, quantity: 9587} 
]; 
 
function * getPage() { 
  const PAGESIZE = 10; 
  let currentPage = 0; 
  while (true) { 
    let curPage = demoDMS.slice(currentPage * PAGESIZE, (currentPage + 1) * PAGESIZE) 
    currentPage++; 
    yield curPage; 
  } 
} 
 
let page = getPage(); 
console.log(page.next().value); 
console.log(page.next().value); 
console.log(page.next().value);

Если не по порядку, то тоже можно, но немного сложнее.

Answer 2

Мой пример ... возвращает но не совсем то

Ваш пример вообще ничего не возвращает. Обратите внимание на отсутствие в коде слова return.

Это два раза повторенное условие с переставленными левой и правой частями

(page * count > index + 1 && index + 1 < page * count)

что проверяет?

Answer 3

Решил свой пример довольно просто. Переписав немного формулу.

const demoDMS = [{ 
    id: 1, 
    quantity: 6436 
  }, 
  { 
    id: 2, 
    quantity: 3131 
  }, 
  { 
    id: 3, 
    quantity: 23 
  }, 
  { 
    id: 4, 
    quantity: 123 
  }, 
  { 
    id: 5, 
    quantity: 3213 
  }, 
  { 
    id: 6, 
    quantity: 322 
  }, 
  { 
    id: 7, 
    quantity: 55 
  }, 
  { 
    id: 8, 
    quantity: 334 
  }, 
  { 
    id: 9, 
    quantity: 13 
  }, 
  { 
    id: 10, 
    quantity: 1414 
  }, 
  { 
    id: 11, 
    quantity: 22 
  }, 
  { 
    id: 12, 
    quantity: 23 
  }, 
  { 
    id: 13, 
    quantity: 424 
  }, 
  { 
    id: 14, 
    quantity: 3232 
  }, 
  { 
    id: 15, 
    quantity: 525 
  }, 
  { 
    id: 16, 
    quantity: 222 
  }, 
  { 
    id: 17, 
    quantity: 123 
  }, 
  { 
    id: 18, 
    quantity: 3213 
  }, 
  { 
    id: 19, 
    quantity: 4124 
  }, 
  { 
    id: 20, 
    quantity: 132 
  }, 
  { 
    id: 21, 
    quantity: 1234 
  }, 
  { 
    id: 22, 
    quantity: 5325 
  }, 
  { 
    id: 23, 
    quantity: 6462 
  }, 
  { 
    id: 24, 
    quantity: 6472 
  }, 
  { 
    id: 25, 
    quantity: 232 
  }, 
  { 
    id: 26, 
    quantity: 5346 
  }, 
  { 
    id: 27, 
    quantity: 5464 
  }, 
  { 
    id: 28, 
    quantity: 12362 
  }, 
  { 
    id: 29, 
    quantity: 8657 
  }, 
  { 
    id: 30, 
    quantity: 9587 
  } 
]; 
 
function rebaseDMSelements(page) { 
  const count = demoDMS.length; //всего записей 
  const cnt = 10; //сколько отображаем сначала 
  const cnt_page = Math.ceil(count / cnt); //кол-во страниц 
 
  let data = demoDMS.filter((i, index) => ((page - 1) * cnt <= index && index + 1 <= page * cnt)); 
  if (page !== cnt_page) { 
    rebaseDMSelements(page + 1) 
  } 
  console.log('page: ' + page, 'count: ' + data.length); 
} 
 
rebaseDMSelements(1);

READ ALSO
поиск в базе по параметрам

поиск в базе по параметрам

ребят, есть 2 таблицы, в 1ой юзер устанавливает для себя теги, во 2ой вывод новостей (с определенными тегами), если какой то из тегов найдет у юзера...

139
теги новости на сайте

теги новости на сайте

хочу при создания новости, на сайте, добавлять к ней тегиПользователь который зарегистрировался выбирает теги, которые ему интересны

163
Отправка потока getUserMedia на сервер Node js

Отправка потока getUserMedia на сервер Node js

Задача: отправить видеопоток с вэбки клиента на серверКод клиента:

181
amp-date-picker выборка по выбранной дате

amp-date-picker выборка по выбранной дате

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

173