Защита от фильтрации пустого объекта JS

1

У меня есть следующий код:

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' }
}
Теги:

3 ответа

2
Лучший ответ

Вы можете использовать пустой массив как значение по умолчанию.

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; }
  • 0
    Я не упоминал, что использую React, но это не должно иметь значения. Первый пример по-прежнему выдает ошибку is not a function . Второй вариант хорош, но он проверяет массив вместо объекта, и он всегда возвращает false.
  • 0
    добавьте структуру данных obj .
Показать ещё 5 комментариев
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);
  }
}
0

Сделайте его функцией, которая принимает объект как аргумент. Затем просто убедитесь, что вы вызываете функцию с действительным инициализированным аргументом. И тогда вы также можете передать foo качестве аргумента:

const f = (obj, foo) => obj.filter((item) => item.id === foo.id)
// ... 
return f(obj, foo)[0]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню