我有以下代码:
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' }
}
答案 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