存在的字段的比较

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);