Javascript: создание объектов с несколькими циклами - PullRequest
0 голосов
/ 20 июня 2019

У меня есть вопрос о макете данных с несколькими отзывами для каждого продукта.

review_id увеличивается в порядке пк, а product_id будет иметь повторяющиеся значения, потому что может быть несколько обзоров для одного и того же продукта. Как показано ниже:

const data = [
  { review_id: 1, product_id: 1 },
  { review_id: 2, product_id: 1 },
  { review_id: 3, product_id: 2 },
  { review_id: 4, product_id: 2 },
  { review_id: 5, product_id: 3 },
  { review_id: 6, product_id: 3 },

 (...)

];

Я пытался создать объект в массиве, используя двойной цикл:

const reviewLength = 10;
const productLength = 2;

const mappedReview = [];
for (let i = 1; i <= reviewLength; i++) {
  for (let j = 1; j <= productLength; j++) {
    const review_id = i * j;
    const product_id = j;

    mappedReview[i * j - 1] = {
      review_id,
      product_id
    };
  }
}

console.log(mappedReview);

Но вместо объекта он был напечатан на консоли следующим образом:

[ { review_id: 1, product_id: 1 },
  { review_id: 2, product_id: 1 },
  { review_id: 3, product_id: 1 },
  { review_id: 4, product_id: 1 },
  { review_id: 5, product_id: 1 },
  { review_id: 6, product_id: 1 },
  { review_id: 7, product_id: 1 },
  { review_id: 8, product_id: 1 },
  { review_id: 9, product_id: 1 },
  { review_id: 10, product_id: 1 },
  <1 empty item>,
  { review_id: 12, product_id: 2 },
  <1 empty item>,
  { review_id: 14, product_id: 2 },
  <1 empty item>,
  { review_id: 16, product_id: 2 },
  <1 empty item>,
  { review_id: 18, product_id: 2 },
  <1 empty item>,
  { review_id: 20, product_id: 2 } ]

Похоже, что вы правильно выполнили цикл, <1 empty item> (в результате того, что вы написали в файле, он выглядит как null).

1 Ответ

0 голосов
/ 20 июня 2019

Поскольку ваш review_id всегда увеличивается, я бы просто использовал один цикл и увеличивал product_id каждый раз, когда мы выводим productLength записей:

const reviewLength = 10;
const productLength = 2;

const mappedReview = [];
let product_id = 1;
let product_counter = 1; // Used to tell when to increment product_id
for (let review_id = 1; review_id <= reviewLength; review_id++) {
    // Add this object
    mappedReview.push({review_id, product_id});
    // Increment product_id if appropriate
    if (product_counter++ === productLength) {
        ++product_id;
        product_counter = 1;
    }
}

console.log(mappedReview);
.as-console-wrapper {
    max-height: 100% !important;
}

Или с использованием вычисления для product_id вместо счетчика:

const reviewLength = 10;
const productLength = 2;

const mappedReview = [];
for (let review_id = 1; review_id <= reviewLength; review_id++) {
    // Add this object
    mappedReview.push({
        review_id,
        product_id: Math.ceil(review_id / productLength)
     });
}

console.log(mappedReview);
.as-console-wrapper {
    max-height: 100% !important;
}

В комментарии вы спросили:

Можно ли использовать карту методов массива, reduce и т. Д.чтобы выразить этот случай?

Вы можете вставить его в вызов map (создав массив, fill, используя его, а затемиспользование map), но использование функции обратного вызова сопоставления Array.from будет иметь больше смысла:

const reviewLength = 10;
const productLength = 2;

const mappedReview = Array.from({length: reviewLength}, (_, index) => ({
    review_id: index + 1,
    product_id: Math.ceil((index + 1) / productLength)
}));

console.log(mappedReview);
.as-console-wrapper {
    max-height: 100% !important;
}

Чтобы получить там map, вы бы Array.from({length: reviewLength}, с (Array(reviewLength).fill().map(:

const mappedReview = Array(reviewLength).fill(0).map((_, index) => ({
    // ...
}));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...