在嵌套的2d对象数组中找到一个值并删除该值

时间:2019-01-22 10:46:09

标签: javascript arrays ecmascript-6

我有一个像这样的嵌套数组:

array = [
  [
    'Bear',
    [
      {
        name: 'bob',
        age: '17,'
      },
      {
        name: 'sam',
        age: '18,'
      },
    ],
  ],
  [
    'dog',
    [
      {
        name: 'bon',
        age: '19,'
      },
    ],
  ],
];

我需要删除/删除该对象: {             名称:“ bon”,             年龄:“ 19岁”           }, 如果上面的数组没有对象,那么上面的数组(在本例中为dog)也应删除 什么是最干净的方法?我尝试过过滤器,但无济于事。不确定如何以干净的方式执行此操作。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

如果要删除Exception in thread "main" java.lang.NullPointerException at com.company.WriteSquat.main(WriteSquat.java:63) 中的项目,然后要根据过滤器的数量删除同级数组,则可以使用reducefilter,如下所示:

name === 'bon'

答案 1 :(得分:1)

如果您应该根据年龄过滤人员,我会保持键和值的动态。它返回一个具有预期结果的新数组。

array = [
  ['Bear', [{name: 'bob', age: '17,'},{name: 'sam', age: '18,'}]],
  ['dog', [{name: 'bon', age: '19'}]],
];

function customFilter(array,key,value) {
    return array.filter(([animal,list]) => {
      list = list.filter(item => item[key] !== value);
      if(list.length == 0)
        return false;
      return true;
    });
}

console.log(customFilter(array,'name','bon'));

答案 2 :(得分:0)

您可以映射到主数组并从子数组中过滤出项,然后再次映射以在其为空时删除项列表:

let array = [
  [
    'Bear',
    [
      {
        name: 'bob',
        age: '17,',
      },
      {
        name: 'sam',
        age: '18,',
      },
    ],
  ],
  [
    'dog',
    [
      {
        name: 'bon',
        age: '19,',
      },
    ],
  ],
];
console.log(
  array
    .map(([name, list]) => [
      name,
      list.filter((item) => item.name !== 'bon'),
    ])
    .map(
      //remove empty lists
      ([name, list]) =>
        list.length === 0 ? [name] : [name, list],
    ),
);

您甚至可以单独传递过滤器功能:

const array = [["Bear",[{"name":"bob","age":"17,"},{"name":"sam","age":"18,"}]],["dog",[{"name":"bon","age":"19,"}]]];

const filterBy = (arr, filterFunction) =>
  arr
    .map(([name, list]) => [
      name,
      list.filter(filterFunction),
    ])
    .map(
      //remove empty lists
      ([name, list]) =>
        list.length === 0 ? [name] : [name, list],
    );

console.log(filterBy(array, (item) => item.name !== 'bon'));

答案 3 :(得分:0)

尝试这个-

array = [
              [
                'Bear',
                [
                  {
                    name: 'bob',
                    age: '17,'
                  },
                  {
                    name: 'sam',
                    age: '18,'
                  },
                ],
              ],
              [
                'dog',
                [
                  {
                    name: 'bon',
                    age: '19,'
                  },
                ],
              ],
            ];

for(var i =0; i< array.length; i++){
    console.log(array[i][0], array[i][1], array[i][1].length);
    if(array[i][1].length <= 1){
        delete(array[i]);
    }
}
console.log(array);