Массив, созданный со случайными числами в качестве индекса и объекты в качестве элементов, дает неверный результат - PullRequest
0 голосов
/ 09 января 2019

У меня есть небольшой скрипт, который скатывает случайные числа и помещает их в массив. Если элемент (объект) не существует, его необходимо добавить, в противном случае его необходимо обновить. Идентификаторы должны быть уникальными идентификаторами. Каким-то образом я получаю дублирующиеся идентификаторы, и я не уверен, почему это происходит.

Я надеялся получить это после бросков (пример 30 бросков):

[{"id":1,"min":0,"max":18},{"id":2,"min":0,"max":2},{"id":3,"min":0,"max":10}]

вместо:

[{"id":1,"min":0,"max":7},{"id":2,"min":0,"max":2},{"id":3,"min":0,"max":10},{"id":1,"min":0,"max":11}]

Кто-нибудь знает, в чем может быть проблема? Заранее спасибо.

var coll_ = [];

for (i = 0; i < 30; i++) {

  random_number = Math.floor((Math.random() * 3) + 1);

  if (!coll_[random_number]) {

    // Item doesnt exist so will be added to the array
    coll_.push({
      id: random_number,
      min: 0,
      max: 1
    });
  } else {
    // Item exists so it will be updated
    coll_[random_number]['max']++;
  }
}

document.write(JSON.stringify(coll_));

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Следующий код (измененный) дает ожидаемый результат:

var coll_ = [];

for (let i = 0; i < 10; i++) {

    random_number = Math.floor((Math.random() * 3) + 1);

    // Item doesnt exist so will be added to the array
    if (!coll_[random_number]) {

        coll_[random_number] = {
                                    id: random_number,
                                    min: 0,
                                    max: 1
                                };
    } else {
        // Item exists so it will be updated
        ++coll_[random_number].max;
    }
}

coll_.shift(); // See note below
console.log(coll_.toSource());
document.write(JSON.stringify(coll_));


Выход:

  • Консоль: [{id:1, min:0, max:4}, {id:2, min:0, max:1}, {id:3, min:0, max:5}]
  • Браузер: [{"id":1,"min":0,"max":4},{"id":2,"min":0,"max":1},{"id":3,"min":0,"max":5}]

Примечание о coll_.shift();:

Этот оператор удаляет первый элемент массива coll_, который равен coll_[0], а его значение равно undefined. Это происходит потому, что массив содержит элементы с индексами 1, 2 и 3. Элемент с нулевым индексом создается JS.

0 голосов
/ 09 января 2019

coll - это массив - проверка coll_[random_number] только проверит, существует ли какой-либо индекс, который не обязательно имеет отношение к id. Вместо использования массива используйте объект, индексированный id s, а затем получите значения этого объекта после того, как закончите итерацию:

const obj = {};
for (let i = 0; i < 30; i++)
{
  const rand = Math.floor((Math.random() * 3) + 1);

  if ( !obj[rand] ) {
  // Item doesnt exist so will be added to the array
     obj[rand] = {id: rand, min: 0, max: 1};
     
  } else {
     // Item exists so it will be updated
     obj[rand].max++;
  } 
}

console.log(Object.values(obj));

Также старайтесь избегать неявного создания глобальных переменных - при использовании нового имени переменной всегда объявляйте его сначала с const (или let или var).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...