Javascript 在多维数组中搜索具有匹配值的对象

Javascript 在多维数组中搜索具有匹配值的对象,javascript,arrays,multidimensional-array,Javascript,Arrays,Multidimensional Array,如何搜索多维数组中的值,然后删除找到该值的对象,下面的代码并不总是相同的,因此我需要一种方法来搜索所有数组,以找到具有特定值的对象 例如,如果我想删除一个id为8的对象,我如何在所有数组和对象中搜索id,然后删除该对象,下面是一个数据示例 { MenuLocation: 'Jersey', MenuItems: [ { id: '1', parentId: '1', position: 2, name: 'test1',

如何搜索多维数组中的值,然后删除找到该值的对象,下面的代码并不总是相同的,因此我需要一种方法来搜索所有数组,以找到具有特定值的对象

例如,如果我想删除一个id为8的对象,我如何在所有数组和对象中搜索id,然后删除该对象,下面是一个数据示例

{
  MenuLocation: 'Jersey',
  MenuItems: [
    {
      id: '1',
      parentId: '1',
      position: 2,
      name: 'test1',
      link: 'http://google.com',
      submenu: []
    },
    {
      id: '2',
      parentId: '2',
      position: 1,
      name: 'test2',
      link: '#',
      submenu: [
        {
          id: '3',
          parentId: '2',
          position: 1,
          name: 'testsub1',
          link: 'http://google.com',
          submenu: []
        },
        {
          id: '4',
          parentId: '2',
          position: 2,
          name: 'testsub2',
          link: 'http://google.com',
          submenu: [
            {
              id: '5',
              parentId: '4',
              position: 1,
              name: 'testsub4.1',
              link: 'http://google.com',
              submenu: []
            },
            {
              id: '6',
              parentId: '4',
              position: 2,
              name: 'testsub4.2',
              link: 'http://google.com',
              submenu: []
            },
            {
              id: '7',
              parentId: '4',
              position: 3,
              name: 'testsub4.3',
              link: 'http://google.com',
              submenu: [
                {
                  id: '8',
                  parentId: '7',
                  position: 3,
                  name: 'testsub4.1',
                  link: 'http://google.com',
                  submenu: []
                },
                {
                  id: '9',
                  parentId: '7',
                  position: 2,
                  name: 'testsub4.2',
                  link: 'http://google.com',
                  submenu: []
                },
                {
                  id: '10',
                  parentId: '7',
                  position: 1,
                  name: 'testsub4.3',
                  link: 'http://google.com',
                  submenu: []
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}
这是我到目前为止所做的,它相当混乱,但它可以工作,但我认为这不是最好的方法

 delClick(id) {


for (var key in this.menu.MenuItems) {
  var obj = this.menu.MenuItems[key];
  if (obj.id == id) {
    console.log('match');
  } else {
    if (obj.submenu.length > 0) {
      for (var key in obj.submenu) {
        var nextobj = obj.submenu[key];
        if (nextobj.id == id) {
          console.log('match');
          console.log(nextobj);
        } else {
          for (var key in nextobj.submenu) {
            var objn = nextobj.submenu[key]
            if (objn.id == id) {
              console.log('match');
              console.log(objn);
            }
          }
        }
      }

    }

  }

}
} }


我必须不断添加for循环,直到它检查所有内容,但我不知道将有多少数组和对象,克服这一问题的最佳方法是什么?

这有点复杂,因为一旦删除项目,就需要更新它们的位置

一个简单但天真的方法是计算一个项目的平面列表,并将其转化为一个地图。通过父项ID获取父项,并根据其位置删除子项,然后更新子菜单中的位置

函数值(数据){
const obj=data.MenuItems | | data.submenu;
如果(对象类型&&typeof对象=='object'){
常量值=对象值(obj);
返回值.concat(values.map(toValues)).flat();
}
返回obj;
}
函数toLkp(数据){
返回到值(数据)。减少((acc,cur)=>{
acc[当前id]=当前;
返回acc;
}, {});
}
函数del(id、数据){
常数lkp=toLkp(数据);
const obj=lkp[id];
PAR= PAL= LKP[OB.PARTEND];
常量位置=对象位置;
Pal.子菜单。拼接(Obj.位置- 1, 1);
对于(PAR.子菜单的常数ITM){
如果(itm.position>pos)itm.position-=1;
}
返回数据;
}
console.log(JSON.stringify(data));
del(3,数据);
console.log(JSON.stringify(data))

风险值数据={
菜单位置:'泽西',
菜单项:[{
id:'1',
parentId:'1',
职位:2,
名称:“test1”,
链接:'http://google.com',
子菜单:[]
},
{
id:'2',
parentId:'2',
职位:1,,
名称:“test2”,
链接:“#”,
子菜单:[{
id:'3',
parentId:'2',
职位:1,,
名称:“testsub1”,
链接:'http://google.com',
子菜单:[]
},
{
id:'4',
parentId:'2',
职位:2,
名称:“testsub2”,
链接:'http://google.com',
子菜单:[{
id:'5',
parentId:'4',
职位:1,,
名称:“testsub4.1”,
链接:'http://google.com',
子菜单:[]
},
{
id:'6',
parentId:'4',
职位:2,
名称:“testsub4.2”,
链接:'http://google.com',
子菜单:[]
},
{
id:'7',
parentId:'4',
职位:3,
名称:“testsub4.3”,
链接:'http://google.com',
子菜单:[{
id:'8',
parentId:'7',
职位:3,
名称:“testsub4.1”,
链接:'http://google.com',
子菜单:[]
},
{
id:'9',
parentId:'7',
职位:2,
名称:“testsub4.2”,
链接:'http://google.com',
子菜单:[]
},
{
id:'10',
parentId:'7',
职位:1,,
名称:“testsub4.3”,
链接:'http://google.com',
子菜单:[]
}
]
}
]
}
]
}
]
}

您需要向我们展示您的尝试,我们是来纠正您的,而不是为您做这项工作的。如果删除的对象有子对象,会发生什么情况?@jonatjano,那么它们都将被删除too@jonatjano很抱歉,我对javascript还很陌生,所以我想我在寻找一些指导,不要指望任何人为我做这一切你需要考虑所有可能的情况。例如,如果对象是一个数组或只是一个对象。例如:a={b:[c:{d},e:[],f:{},f:{….}等等。对于数组,使用object.keys()函数或foreach。类似地迭代对象等。