Найти значение во вложенном 2d массиве объектов и удалить значение - PullRequest
0 голосов
/ 22 января 2019

У меня есть такой вложенный массив:

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

Мне нужно удалить / удалить этот объект: {name: 'bon', age: '19, '}, если указанный выше массив не имеетОбъекты, а затем массив выше, который в данном случае - собака, также должны быть удалены. Какой самый чистый способ сделать это?Я пробовал фильтр, но безрезультатно.Не уверен, как это сделать чистым способом.Любая помощь будет высоко ценится.

Ответы [ 4 ]

0 голосов
/ 22 января 2019

попробуйте это-

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);
0 голосов
/ 22 января 2019

Если вы хотите удалить элементы, если name === 'bon', а затем хотите удалить массив одноуровневых элементов на основе счетчика фильтра, вы можете использовать reduce и filter вот так:

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

const output = array.reduce((acc,[animal, people]) => {
  const filtered = people.filter(a => a.name !== name);
  if(filtered.length > 0) 
    acc.push([animal, filtered]);
  return acc;
}, [])

console.log(output)
0 голосов
/ 22 января 2019

Вы можете отобразить основной массив и отфильтровать элементы из подмассива, а затем снова отобразить, чтобы удалить список элементов, когда он пуст:

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'));
0 голосов
/ 22 января 2019

Я сохранил ключ и значение в динамике на случай, если вам придется фильтровать людей по возрасту.Возвращает новый массив с ожидаемыми результатами.

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'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...