存在的字段的比较
Comparison of fields that exist
如果我有一个对象数组并且需要在其中查找某些内容,我可以使用 underscore/lodash
的 find
函数
let part = { id: 'foo' };
_.find(arr, p => p.id === part.id);
这很简单。那么多个属性呢?
let part = { id: 'foo', name: 'part foo' };
_.find(arr, p => p.id === part.id && p.name === part.name);
但坚持下去。如果我需要一个函数,它会首先比较 id
,然后如果 name
存在然后比较 name
,然后可能会比较 part
中存在的其他字段。这样做似乎不对:
_.find(arr, p => {
return p.id === part.id
&& (part.name && p.name === part.name)
&& (part.title && p.title === part.title);
});
如果 title
存在而 name
不存在,将无法找到零件。
另外,如果我有更长的属性列表要比较,我可以避免函数体臃肿吗?
你有几个选择....
你可以做一个专门的比较函数isPartEqual(p, part)
_.find(arr, p => isPartEqual(p, part));
或者您可以创建 compareIfExists(p,part,['id','name','title'])
或者如果"part"包含你要匹配的所有字段,那么在lodash
_.findWhere(arr, part)
试试这个:
return p.id === part.id
&& (!part.name || p.name === part.name)
&& (!part.title || p.title === part.title);
这样做会使它把 part
中不存在的任何 属性 视为匹配,因此它只对存在的属性进行真正的比较。
此缩写语法还假定 part.X
的有效值从不为假。您可以通过以下方式使其更安全:
return p.id === part.id
&& (!part.hasOwnProperty("name") || p.name === part.name)
&& (!past.hasOwnProperty("title") || p.title == part.title);
如果我有一个对象数组并且需要在其中查找某些内容,我可以使用 underscore/lodash
的find
函数
let part = { id: 'foo' };
_.find(arr, p => p.id === part.id);
这很简单。那么多个属性呢?
let part = { id: 'foo', name: 'part foo' };
_.find(arr, p => p.id === part.id && p.name === part.name);
但坚持下去。如果我需要一个函数,它会首先比较 id
,然后如果 name
存在然后比较 name
,然后可能会比较 part
中存在的其他字段。这样做似乎不对:
_.find(arr, p => {
return p.id === part.id
&& (part.name && p.name === part.name)
&& (part.title && p.title === part.title);
});
如果 title
存在而 name
不存在,将无法找到零件。
另外,如果我有更长的属性列表要比较,我可以避免函数体臃肿吗?
你有几个选择....
你可以做一个专门的比较函数isPartEqual(p, part)
_.find(arr, p => isPartEqual(p, part));
或者您可以创建 compareIfExists(p,part,['id','name','title'])
或者如果"part"包含你要匹配的所有字段,那么在lodash
_.findWhere(arr, part)
试试这个:
return p.id === part.id
&& (!part.name || p.name === part.name)
&& (!part.title || p.title === part.title);
这样做会使它把 part
中不存在的任何 属性 视为匹配,因此它只对存在的属性进行真正的比较。
此缩写语法还假定 part.X
的有效值从不为假。您可以通过以下方式使其更安全:
return p.id === part.id
&& (!part.hasOwnProperty("name") || p.name === part.name)
&& (!past.hasOwnProperty("title") || p.title == part.title);