Создать карту объекта из элементов JavaScript добавить или удалить значения - PullRequest
0 голосов
/ 13 мая 2019

У меня есть объекты

let obj1 = { categoryId:1, category:"Fruits", name:"Orange"}
let obj2 = { categoryId:1, category:"Fruits",name:"Apple"}
let obj3 = { categoryId:2, category:"Vegetables", name:"Onion"} 
let obj4 = { categoryId:2, category:"Vegetables", name:"Ginger"}....etc

Я хочу создать карту из этого массива, ожидаемого:

{
  "Fruits": [{
    "categoryId": 1,
    "category": "Fruits",
    "name": "Orange"
  }, {
    "categoryId": 1,
    "category": "Fruits",
    "name": "Apple"
  }],
  "Vegetables": [{
    "categoryId": 2,
    "category": "Vegetables",
    "name": "Onion"
  }, {
    "categoryId": 2,
    "category": "Vegetables",
    "name": "Ginger"
  }]
}

Я ищу функцию для добавления на карту одну за другой

addtoMap( obj1);
addtoMap( obj2); 
addtoMap( obj3); 
addtoMap( obj4);....etc 

Также удалить с карты

removeFromMap( obj1);

Я пытался

addtoMap(xs, key) {
  return xs.reduce(function(rv, x) {
    (rv[x[key]] = rv[x[key]] || []).push(x);
    return rv;
  }, {});
};

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Вы можете проверить, существует ли объект и добавить объект в требуемую категорию. То же самое касается удаления объекта до тех пор, пока в группе не останется больше объектов. Затем группа также удаляется.

function addToCollection(collection, object) {
    if (!collection[object.category]) {
        collection[object.category] = [object];
        return;
    }
    if (collection[object.category].includes(object)) return;
    collection[object.category].push(object);
}

function removeFromCollection(collection, object) {
    if (!collection[object.category]) return;
    var index = collection[object.category].indexOf(object);
    if (index === -1) return;
    collection[object.category].splice(index, 1);
    if (!collection[object.category].length) delete collection[object.category];
}

var obj1 = { categoryId: 1, category: "Fruits", name:"Orange" },
    obj2 = { categoryId: 1, category: "Fruits", name:"Apple" },
    obj3 = { categoryId: 2, category: "Vegetables", name:"Onion" },
    obj4 = { categoryId: 2, category: "Vegetables", name:"Ginger" },
    collection = {};


addToCollection(collection, obj1);
addToCollection(collection, obj2);
addToCollection(collection, obj3);
addToCollection(collection, obj4);
console.log(collection);
removeFromCollection(collection, obj2);
console.log(collection);
removeFromCollection(collection, obj1);
console.log(collection);
0 голосов
/ 13 мая 2019

Есть много способов выполнить ваши требования, но вот способ сделать это неизменно:

let obj1 = { categoryId:1, category:"Fruits", name:"Orange"}
let obj2 = { categoryId:1, category:"Fruits",name:"Apple"}
let obj3 = { categoryId:2, category:"Vegetables", name:"Onion"} 
let obj4 = { categoryId:2, category:"Vegetables", name:"Ginger"}

const add = (map, o) => ({ ...map, [o.category]: [...(map[o.category] || []), o] });
  
const remove = (map, o) => ({ ...map, [o.category]: map[o.category].filter(x => x.name !== o.name) });

let map = {};
map = add(map, obj1);
map = add(map, obj2);
map = add(map, obj3);
map = add(map, obj4);

console.log(JSON.stringify(map));

map = remove(map, obj1);
map = remove(map, obj2);

console.log(JSON.stringify(map));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...