Учитывая
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 */)
to
-
фильтровать массив для объектов
Object
:{}
; даже если объект не имеет определенного прототипа или конструктора; возможно преобразованиеJSON
string"{"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
pattern? -
Как фильтровать определенные объекты в массиве, переданные в
Array.prototype.filter()
, передавая имя или значение свойства для соответствия объекту без использования анонимной функцииcallback
pattern?