Как фильтровать массив объектов с помощью объекта - PullRequest
2 голосов
/ 06 августа 2020

Я хочу отфильтровать массив объектов по элементам другого массива. Это мой список элементов:

const list = ["first", "second", "third"]

Этот массив может быть пустым, с одним, двумя или тремя элементами ... Например:

const list = []
const list = ["first"]
let list = ["first", "third"]

Итак, мне нужно использовать my list для фильтрации моего myArr2 по статусу.

const myArr2 = [
  {
    id: "1",
    language: "portuguese",
    status: "first"    
  },
  {
    id: "2",
    language: "portuguese",
    status: "first"    
  },
  {
    id: "3",
    language: "portuguese",
    status: "second"    
  },
  {
    id: "4",
    language: "portuguese",
    status: "third"    
  },      
  {
    id: "5",
    language: "portuguese",
    status: "second"    
  },      
]

Если мой list равен:

const list = [ "first", "third" ]

Результат должен быть:

const myArr2 = [
  {
    id: "1",
    language: "portuguese",
    status: "first"    
  },
  {
    id: "2",
    language: "portuguese",
    status: "first"    
  },
  {
    id: "4",
    language: "portuguese",
    status: "third"    
  },      
]

Если мой list равен:

const list = [ "first" ]

Результат должен быть:

const myArr2 = [
  {
    id: "1"
    language: "portuguese"
    status: "first"    
  },
  {
    id: "2"
    language: "portuguese"
    status: "first"    
  }  
}

и так далее ...

Я сделал этот код, но не работает исправно:

Object.entries(list).forEach(status => {
  myArr2.filter(item => {
    if(item.status === status){
      return item
    }
  })
})

Что я делаю не так? Кто-нибудь может мне помочь?

Ответы [ 3 ]

1 голос
/ 06 августа 2020

Вы делаете это, я бы сказал наоборот. Вам необходимо проверить для каждого элемента в myArr2, имеет ли элемент свой статус, который присутствует в массиве списка. Вы можете сделать это следующим образом -

Правильный код -

let myArr2 = [
  {
    id: "1",
    language: "portuguese",
    status: "first"    
  },
  {
    id: "2",
    language: "portuguese",
    status: "first"    
  },
  {
    id: "3",
    language: "portuguese",
    status: "second"    
  },
  {
    id: "4",
    language: "portuguese",
    status: "third"    
  },      
  {
    id: "5",
    language: "portuguese",
    status: "second"    
  },      
];
const list = [ "first", "third" ]

myArr2 = myArr2.filter(item => list.includes(item.status))
console.log(myArr2)

Ошибка в вашем подходе

Object.entries(list).forEach(status => {
  myArr2.filter(item => {
    if(item.status === status){
      return item
    }
  })
})

В приведенном выше подходе вы будете перебирать первый элемент в списке (то есть first). Таким образом, он отфильтрует все элементы из myArr2, которые не имеют статуса первого.

На следующей итерации вы проверите второй элемент в списке (то есть second). Итак, теперь он снова будет отфильтровывать все элементы из myArr2, которые не имеют статуса second. Поскольку ни один элемент не имеет своего статуса как первого, так и второго одновременно, ваш код, вероятно, вернет результирующий массив как пустой массив.

ПРИМЕЧАНИЕ : вам нужно будет присвоить новый массив, возвращаемый myArr2, некоторой переменной. Метод filter не фильтрует элементы на месте. Итак, поскольку вы этого не сделали, ваш код, вероятно, предоставит вам сам исходный массив, если вы попытаетесь проверить его с помощью ведения журнала консоли.

Подробнее о filter() можно узнать здесь .

0 голосов
/ 06 августа 2020

Вы можете фильтровать массив. Проверьте это, если элементы являются частью вашего списка фильтров (indexOf! = -1).

function filterArray(arr, list) {
    return arr.filter(el => {
        return list.indexOf(el.status)!=-1;
    });
}

const myArr2 = [
  {
    id: "1",
    language: "portuguese",
    status: "first"    
  },
  {
    id: "2",
    language: "portuguese",
    status: "first"    
  },
  {
    id: "3",
    language: "portuguese",
    status: "second"    
  },
  {
    id: "4",
    language: "portuguese",
    status: "third"    
  },      
  {
    id: "5",
    language: "portuguese",
    status: "second"    
  },      
]

list1 = []
list2 = ["first"]
list3 = ["first", "third"]

console.log(filterArray(myArr2, list3));
console.log(filterArray(myArr2, list2));
console.log(filterArray(myArr2, list1));
0 голосов
/ 06 августа 2020

Вы можете деструктурировать status и проверить, содержит ли list это значение.

result = myArr2.filter(({ status }) => list.includes(status));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...