防止过滤空的JS对象

时间:2017-06-08 06:58:20

标签: javascript

我有以下代码:

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,因为当页面呈现并且稍后填充时对象为空。 问题是 - 如何简化这一过程,同时防止以最简单的方式过滤空对象?

编辑:为obj

添加样本数据结构
{
    0: { id: 2, name: 'John', category: 'Repair' },
    1: { id: 3, name: 'William', category: 'Maintenance' }
}

3 个答案:

答案 0 :(得分: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; }




答案 1 :(得分:0)

使它成为一个以对象为参数的函数。然后确保使用有效的初始化参数调用该函数。然后你也可以传递foo作为参数:

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

答案 2 :(得分:-1)

index.php