Javascript: добавление к значению ключа, где значением является список - PullRequest
2 голосов
/ 06 мая 2019

Я сделаю ссылку на следующее: тестовый объект видовой объект.

Внутри объекта "виды" у меня есть два свойства: "виды" и "состояние". Свойство "state" имеет значение, представляющее собой массив с состояниями. Я хочу создать ключ для «тестового» объекта, который соответствует каждому состоянию внутри массива «state», расположенного в объекте вида объекта.

Пример вывода (посмотрите на код ниже, чтобы увидеть, откуда берутся эти значения):

{a: ["tiger", "dog"], b: ["tiger"], c: ["dog","lion"], d: ["tiger", "dog"], e: ["lion:]}

Идея состоит в том, что я хочу перечислить виды в каждом штате, и виды часто не ограничиваются одним штатом, поэтому один вид в Кентукки также может быть найден в Огайо. Я хочу, чтобы этот вид был внесен в список обитателей обоих государств, как описано выше.

Я получаю следующую ошибку:

Uncaught (in promise) TypeError: test[d].append is not a function
    at script.js:272
    at Array.forEach (<anonymous>)
    at runVis (script.js:270)
    at script.js:178

А вот и мой код:

  var test = new Object();
  var species = [{species: "tiger", state: ["a","b","d"]},
                 {species: "dog", state: ["a","c","d"]},
                 {species: "lion", state: ["c", "e"]}
               ];
  for (i in species) {
    species[i].state.forEach(function(d) {
      if (d in test) {
        test[d].append(species[i].species)
      }
      else {
        test[d] = [species[i].species];
        console.log(test);
      }
    })
  }

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

1 Ответ

2 голосов
/ 06 мая 2019

Это push не append:

for (i in species) {
  species[i].state.forEach(function(d) {
    if (d in test) {
      test[d].push(species[i].species)
    } else {
      test[d] = [species[i].species];
      console.log(test);
    }
  })
}

Вы также можете использовать reduce вместо этого, например:

var species = [{species: "tiger", state: ["a","b","d"]},{species: "dog", state: ["a","c","d"]},{species: "lion", state: ["c", "e"]}];
var test = species.reduce((acc, { species, state }) => {
  state.forEach(s => {
    acc[s] = acc[s] || [];
    acc[s].push(species);
  });
  return acc;
}, {});
console.log(test);
.as-console-wrapper { max-height: 100% !important; top: auto; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...