Как отфильтровать объект с помощью 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
шаблон ?