У меня есть следующий код:
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
if (obj[key].id === foo.id) {
// do something
}
}
}
Я проверяю, не является ли объект незаполненным, прежде чем выполнять какие-либо функции, потому что массив заполняется позже при взаимодействии с пользователем.
Для лучшей читаемости я хочу сделать что-то вроде этого:
const result = obj.filter((item) => item.id === foo.id)
return result[0]
Это, однако, приведет к ошибке: obj.filter is not a function
поскольку объект пуст, когда страница отображается и заполняется позже. Вопрос: как это упростить и в то же время защищать от фильтрации пустого объекта самым простым способом?
EDIT: добавление структуры выборочных данных для obj
{
0: { id: 2, name: 'John', category: 'Repair' },
1: { id: 3, name: 'William', category: 'Maintenance' }
}
Вы можете использовать пустой массив как значение по умолчанию.
const result = (obj || []).filter(item => item.id === foo.id);
или используйте явную проверку с помощью Array.isArray
.
const result = Array.isArray(obj) && obj.filter(item => item.id === foo.id);
Результатом будет либо массив, либо false
.
Если вы хотите получить пустой массив, вы можете использовать массив как значение по умолчанию, например
const result = Array.isArray(obj) && obj.filter(item => item.id === foo.id) || [];
Теперь, после создания структуры объекта, вы можете использовать
var getItem = (obj, id) => obj && typeof obj === 'object' && Object
.keys(obj)
.filter(key => obj[key].id === id)
.map(key => obj[key]),
obj = {
0: { id: 2, name: 'John', category: 'Repair' },
1: { id: 3, name: 'William', category: 'Maintenance' }
},
result1 = getItem(obj, 3),
result2 = getItem(null, 3);
console.log(result1);
console.log(result2);
.as-console-wrapper { max-height: 100% !important; top: 0; }
var obj = {
"0": { id: 2, name: 'John', category: 'Repair' },
"1": { id: 3, name: 'William', category: 'Maintenance' }
};
var keys = Object.keys(obj);
for (var i = 0; i < keys.length; i++) {
var k = keys[i];
if (obj.hasOwnProperty(k)) {
console.log(obj[k].name + ' works in ' + obj[k].category);
}
}
Сделайте его функцией, которая принимает объект как аргумент. Затем просто убедитесь, что вы вызываете функцию с действительным инициализированным аргументом. И тогда вы также можете передать foo
качестве аргумента:
const f = (obj, foo) => obj.filter((item) => item.id === foo.id)
// ...
return f(obj, foo)[0]
is not a function
. Второй вариант хорош, но он проверяет массив вместо объекта, и он всегда возвращает false.obj
.