Организация объекта для создания ключей при необходимости и / или добавления другого атрибута в массив пар значений - PullRequest
0 голосов
/ 25 ноября 2018

Структура данных, которую я пытаюсь получить, выглядела бы так: я хотел бы, чтобы list_id стал ключом в объекте и содержал все идентификаторы элементов, которые имеют соответствующий список идентификаторов.

var lists = { (list_id)1 : [1, 2, 3]
              (list_id)2 : [4, 5, 6]
              (list_id)3 : [7, 8, 9]
              (list_id)4 : [10, 11, 12] };

этот объект создан из структуры данных json, которая выглядит следующим образом:

    let json = [{ id: 1, list_id: 1 }, { id: 2, list_id: 1 }, 
                {id: 3, list_id: 1 }, {id: 4, list_id: 2 },
                {id: 5, list_id: 2 }, {id: 6, list_id: 2 },
                {id: 7, list_id: 3 }, {id: 8, list_id: 3 },
                {id: 9, list_id: 3 }, {id: 10, list_id: 4  },
                {id: 11, list_id: 4 }, {id: 12, list_id: 4 }]

Я могу создать объект, который содержит все list_id в качестве ключей, но меня озадачивает нажатие actions_id в значениемассив пар с идентификатором списка совпадений.

 let listAll = {};

 json.forEach(function(lista, index, listb) {
   listAll[lista.list_id] = [];

   if ( listAll[lista.list_id] === lista.list_id){

      listAll[lista.list_id].push(lista.id)

    } else {

      listAll[lista.list_id] = [lista.id];

    }
});

Моя цель - иметь и объект, содержащий ключ для каждого list_id, доступного в настоящее время из действий.Затем добавьте каждое действие, которое содержит соответствующий list_id, в массив пар значений.

текущий вывод этого кода

{ '1': [ 3 ], '2': [ 6 ], '3': [ 9 ], '4': [ 12 ] }

, который не содержит все числа, каждый массив должен содержать 3 числа.

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Почему бы вам не попробовать hasOwnProperty вместо?

var listAll = {};
json.forEach(function(list, index) {
  if (listAll.hasOwnProperty(list.list_id)) {
    listAll[list.list_id].push(list.id);
  }else {
    listAll[list.list_id] = [list.id];
  } 
});
console.log(listAll);
0 голосов
/ 25 ноября 2018

Альтернативой является использование функции reduce для группировки объектов по определенному key = ['list_id', list_id].join('').

let json = [{ id: 1, list_id: 1 }, { id: 2, list_id: 1 },                 {id: 3, list_id: 1 }, {id: 4, list_id: 2 },                {id: 5, list_id: 2 }, {id: 6, list_id: 2 },                {id: 7, list_id: 3 }, {id: 8, list_id: 3 },                {id: 9, list_id: 3 }, {id: 10, list_id: 4  },                {id: 11, list_id: 4 }, {id: 12, list_id: 4 }],
    result = json.reduce((a, {id, list_id}) => {
      let key = ['list_id', list_id].join(''); // For example: this is creating ['list_id', 1] to list_id1
      (a[key] || (a[key] = [])).push(id);
      return a;
    }, Object.create(null)/*This is only to create an object without prototype -> {}*/);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...