Javascript 现有字段的比较
如果我有一个对象数组,需要在其中查找某些内容,我可以使用下划线/lodash的Javascript 现有字段的比较,javascript,underscore.js,Javascript,Underscore.js,如果我有一个对象数组,需要在其中查找某些内容,我可以使用下划线/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); 但是,等一下。如果
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
进行比较,然后可能通过部分中存在的其他字段进行比较,该怎么办。这样做似乎不对:
_.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)
或者您可以创建比较存在(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);
如果我问你“我怎么计算三角形的面积”,你会说——从尺子开始。你的回答似乎很有帮助,但我不知道如何…酷,谢谢。另一个例子解释了为什么包括javascript在内的命令式语言中的运算符优先级和关联性很糟糕。它与优先级或关联性无关。您的逻辑完全错误。您的逻辑将缺少的字段视为不匹配,而不是忽略该字段。什么意思与此无关?它会根据优先规则进行短路?。逻辑NOT是更高的,然后是或。我的观点是——如果你不知道到底发生了什么,那么最终你很难阅读和推理这样的代码。我的答案和你的代码有相同的括号分组。问题是您需要使用OR、not和,并反转属性的测试。你的逻辑颠倒了。
return p.id === part.id
&& (!part.hasOwnProperty("name") || p.name === part.name)
&& (!past.hasOwnProperty("title") || p.title == part.title);