现有字段的比较

Comparison of fields that exist

本文关键字:比较 字段      更新时间:2023-09-26

如果我有一个对象数组,需要在其中找到一些东西,我可以使用下划线/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不存在,它将无法找到零件。另外,若我有更长的属性列表要比较,我能避免函数体臃肿吗?

试试这个:

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

您有几个选项。。。。

您可以制作一个专用的比较功能isPartEqual(p, part)

_.find(arr, p => isPartEqual(p, part));

或者您可以创建compareIfExists(p,part,['id','name','title'])

或者,如果"部分"包含您想要匹配的所有字段,则在lodash 中

_.findWhere(arr, part)