Как отфильтровать объект с помощью Array.prototype.filter?

Дано

var arr = [1,2,true,4,{"abc":123},6,7,{"def":456},9,[10]]

мы можем отфильтровать количество элементов в массивеarr с помощьюNumber конструктор

var res = arr.filter(Number); // [1, 2, true, 4, 6, 7, 9, Array[1]]

являютсяtrue а также[10] ожидается в результирующем массиве? Если мы заменимfalse заtrue вarr

var arr = [1,2,false,4,{"abc":123},6,7,{"def":456},9,[10]] 
var res = arr.filter(Number) // [1, 2, 4, 6, 7, 9, Array[1]]

с помощьюArray.isArray

var res = arr.filter(Array.isArray) // [Array[1]]

String

var res = arr.filter(String) // [1, 2, true, 4, Object, 6, 7, Object, 9, Array[1]]

Если мы хотим отфильтровать элементы вarr то есть объект, у индексов4 , 7 и мы пытаемся

var res = arr.filter(Object) // [1, 2, true, 4, Object, 6, 7, Object, 9, Array[1]]

Хотя мы бы предпочли просто позвонитьarr.filter(Object)мы могли бы передать вызов функции; пробуя разные свойстваObject так что мы можем в конечном итоге найти свойство или метод, который мы могли бы использовать в качестве функции или конструктора для передачи в качестве шаблонаarr.filter(/* method, constructor, other approach */) вернуть отфильтрованные результаты, соответствующие объекту, или даже имя свойства или значение объекта во входном массиве.

Мы начинаем, достаточно невинно, с проверки, имеет ли элемент в массивеconstructor имеющийname равно"Object"

 var res = arr.filter(function(prop) {
  return prop.constructor.name === "Object"
 }) // [Object, Object]

хотя, когда мы добавляем объект вarr; например.;

 var c = Object.create(null); arr.push(c); 

 var res = arr.filter(function(prop) {
   return prop.constructor.name === "Object"
 }) // `Uncaught TypeError: Cannot read property 'name' of undefined`

какc prototype а такжеconstructor являютсяundefined, Хотя мы уверены, что это не даст ожидаемых результатов

var n = arr.filter(Object.hasOwnProperty, "abc"); // [1, 2]

по крайней мере, ошибка не была возвращена; давайте продолжим

var n = arr.filter(function(prop, val) {
          return prop.hasOwnProperty(this.valueOf())
        }, "abc"); // [Object abc: 123__proto__: Object]

ожидаемые результаты возвращаются; хотя мы пытаемся использовать

var n = arr.filter(/* function reference */, this /* optional parameters passed */)

в

фильтровать массив дляObject : {} объекты; даже если объект не имеет определенного прототипа или конструктора; необязательно преобразованиеJSON строка"{"abc":123}" для объекта; хотя мы еще не достигли этого далеко;

передать имя свойства.filter(callback, this) образец гдеthis служит именем свойства или значением объекта; или использовать подход с использованиемfilter.bind , .call или же.apply или другой метод фильтрации объекта из входного массива - без использования полного

.filter(function(prop, value) {})

шаблон. Как мы можем заставитьObject.hasOwnProperty() позвонить в шаблон, похожий на

.filter(Object.hasOwnProperty, "abc")

?

Упоминание.call, .bind а также.apply после поиска аналогичного вопроса и нахожденияJS Array.prototype.filter по методу-прототипу , Хотя не ясно, как реализовать подходы, описанные при фильтрации как объектов, так и объектов, имеющих конкретные свойства, как описано выше.

Примечание. Вопрос также может быть решенdestructuring , или другойes-6, es-7 подход, обеспечивающий сопоставимые или даже более строгие результаты по сравнению с.filter(), То есть использовать.filter() без

   function(prop, value) {

   }

шаблон. Возврат предметов; то естьObject , {} ; и объекты, отфильтрованные по свойству; объекты фильтруются по значению свойства.

Вопросы:

Как фильтровать объекты с или безObject прототип или конструктор в массиве передаетсяArray.prototype.filter() без использования анонимной функцииcallbackшаблон ?

Как фильтровать определенные объекты в массиве, переданном вArray.prototype.filter() путем передачи имени свойства или значения для сопоставления объекта без использования анонимной функцииcallback шаблон ?

Ответы на вопрос(5)

Ваш ответ на вопрос