存在的字段比较

时间:2015-12-22 21:52:58

标签: javascript underscore.js

如果我有一个对象数组并且需要在其中找到一些东西,我可以使用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不存在,则无法找到部件。 另外,如果我有更长的属性列表进行比较,我可以避免使用该函数的膨胀体吗?

2 个答案:

答案 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