如果我有一个对象数组并且需要在其中找到一些东西,我可以使用find
下划线/ lodash函数
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
不存在,则无法找到部件。
另外,如果我有更长的属性列表进行比较,我可以避免使用该函数的膨胀体吗?
答案 0 :(得分:1)
你有几个选择......
您可以制作专门的比较函数isPartEqual(p, part)
_.find(arr, p => isPartEqual(p, part));
或者您可以创建compareIfExists(p,part,['id','name','title'])
或者如果" part"包含您要匹配的所有字段,然后在lodash中
_.findWhere(arr, part)
答案 1 :(得分:1)
试试这个:
function B() {};
B.getClass = function() {
return window[this.name];
}
B.getInstance() {
return new window[this.name];
}
这样做会使它将return p.id === part.id
&& (!part.name || p.name === part.name)
&& (!part.title || p.title === part.title);
中不存在的任何属性视为匹配,因此它只对存在的属性进行真实比较。
这种缩写语法还假设part
的有效值永远不会是假的。您可以通过以下方式使其更安全:
part.X