Javascript фильтрует массив объектов по классам

#javascript #arrays #filter

#javascript #массивы #Фильтр

Вопрос:

в этом массиве объектов

 array = [
0: foo1{name: "111", energy: 0, capacity: 0, comsuption: 0, season: 0, …}
1: foo1 {name: "222", energy: 0, capacity: 0, comsuption: 0, season: 0, …}
2: foo2 {name: "3", energy: 0, capacity: 0, comsuption: 0, season: 0, …}
3: foo2 {name: "5", energy: 0, capacity: 0, comsuption: 0, season: 0, …}
4: foo3 {name: "22", energy: 0, capacity: 0, comsuption: 0, season: 0, …}
5: foo1 {name: "444", energy: 0, capacity: 0, comsuption: 0, season: 0, …}
]
  

существует метод фильтрации по классу объекта?.
пример :

 let arr = array.filter( foo => foo === foo1) ; 
  

// ожидаемый результат:

 arr = [ 
0: foo1 {name: "111", energy: 0, capacity: 0, comsuption: 0, season: 0, …}
1: foo1 {name: "222", energy: 0, capacity: 0, comsuption: 0, season: 0, …}
2: foo1 {name: "444", energy: 0, capacity: 0, comsuption: 0, season: 0, …}
]
  

https://stackblitz.com/edit/js-mkeg2b
спасибо

Комментарии:

1. пожалуйста, добавьте допустимую структуру данных.

2. извините, добавлен stackblitz.

Ответ №1:

Используя instanceof

Оператор instanceof проверяет, появляется ли свойство prototype конструктора где-либо в цепочке прототипов объекта. Возвращаемое значение является логическим значением.

 let arr = array.filter(foo => foo instanceof foo1)
  

 let arr = []

class foo1 {
  constructor(name, value) {
    this.name = '',
      this.value = 0
  }
}

class foo2 {
  constructor(name, value) {
    this.name = '',
      this.value = 0
  }
}

class foo3 {
  constructor(name, value) {
    this.name = '',
      this.value = 0
  }
}

let bar1 = new foo1();
let bar2 = new foo2();
let bar3 = new foo3();

arr.push(bar1, bar1, bar1, bar1, bar2, bar3, bar2, bar1);

document.write('check in browser console')
console.log(arr.filter(foo => foo instanceof foo1))  

Ответ №2:

 const 
    array = [{ foo1: { name: "111", energy: 0, capacity: 0, comsuption: 0, season: 0 } }, { foo1: { name: "222", energy: 0, capacity: 0, comsuption: 0, season: 0 } }, { foo2: { name: "3", energy: 0, capacity: 0, comsuption: 0, season: 0 } }, { foo2: { name: "5", energy: 0, capacity: 0, comsuption: 0, season: 0 } }, { foo3: { name: "22", energy: 0, capacity: 0, comsuption: 0, season: 0 } }, { foo1: { name: "444", energy: 0, capacity: 0, comsuption: 0, season: 0 } }]
    
let result = array.filter(o=>o.foo1); 

console.log(result);  

Ответ №3:

Вы также можете использовать constructor.name для фильтрации массива на основе конструктора.

 let arr = array.filter(foo => foo.constructor.name === "foo1")