首页 > 解决方案 > javascript返回嵌套对象数组并排列相似类型

问题描述

javascript返回嵌套对象数组并排列相似类型

我有对象

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

我想从这个预期的数组创建一个嵌套对象数组:

let result =   

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

我正在寻找一种功能,而不是一次全部添加到地图中

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

还有一个删除功能:

removeFromArray( obj1);

在删除对象不能相同:

{ categoryId:1, category:"Fruits", name:"Orange", newItem:"newvalue"}

它应该使用category:"Fruits"参考删除

删除一个对象,直到组中没有更多对象。然后该组也被删除。

我尝试的是下面

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

function removeFromArray(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 = {};

请指导我!!

标签: javascriptarraysobject

解决方案


添加到数组的函数:

var arr=[];

const addToArray=(arr,obj)=>{
  const index=findByName(arr,obj.category);
  if(index>-1){
    arr[i].values.push(obj)
  }else{
    arr.push({
      name:obj.category,
      values:[obj]
    })
  }
}
const findByName=(arr,name)=>{
  for(var i=0;i<arr.length;i++){
    if(arr[i].name===name)
      return i;
  }
  return -1;
}

addToArray(arr,obj1)

推荐阅读