Как ассоциативный массив с тем же именем и разными ключами работает на JavaScript? - PullRequest
0 голосов
/ 17 марта 2019

Я новичок в javascript, так что прости меня, если этот вопрос выглядит глупо. Я нашел этот код в качестве решения для управления элементами в корзине, но я не понимаю, как это должно работать?!

function add(ref,nbr,price){
    if (basket[ref] == undefined) {
       basket[ref] = [];
       basket[ref]["nbr"] = nbr;
       basket[ref]["price"] = price;
    }else 
       basket[ref]["nbr"] += nbr;
}

1 Ответ

0 голосов
/ 17 марта 2019

basket имеет несколько ключей, которые можно использовать для поиска значений.Когда кто-то вызывает эту функцию, он вызывает ее с определенным ключом для поиска.Что-то может быть там или нет.Код предполагает, что если что-то есть, то оно, по крайней мере, имеет ключ nbr.

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

Новое значение для хранения в этом ключе инициализируется нестандартным способом: обычно вы используете {}, а не [], так как оно используется какассоциативный массив, а не последовательный массив.Но в Javascript последовательный массив на самом деле является просто еще одним видом ассоциативного массива, и поэтому этот код не является неправильным.

Скажем, корзина содержала: { refA: { nbr: 2, price: 3 } } и кто-то по имени add("refB", 2, 3).Вот что произойдет:

  1. Поиск refB в basket.В корзине нет такого ключа, поэтому результат равен undefined.Мы входим в блок if.
  2. Устанавливаем refB в basket в [].Теперь basket выглядит следующим образом: { refA: { nbr: 2, price: 3 }, refB: {} } (Не обращайте внимания на различие между [] и {}, потому что в этом случае оно вводит в заблуждение.)
  3. Установите ключ nbr на новом объекте на 3Это было бы невозможно без объекта для установки ключа, поэтому шаг 2 необходим.Результат теперь выглядит следующим образом: { refA: { nbr: 2, price: 3 }, refB: { nbr: 2 } }
  4. Наконец, установите price для нового объекта.

Надеюсь, это поможет вам понять, как работает код.Наконец, более стандартный способ написания этого кода:

function add(ref,nbr,price){
    if (basket[ref] === undefined) {
       basket[ref] = { nbr: nbr, price: price }; // The shorthand for this in ES5 and later is { nbr, price }
    } else { 
       basket[ref].nbr += nbr;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...