Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 现有字段的比较_Javascript_Underscore.js - Fatal编程技术网

Javascript 现有字段的比较

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); 但是,等一下。如果

如果我有一个对象数组,需要在其中查找某些内容,我可以使用下划线/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
进行比较,然后可能通过
部分中存在的其他字段进行比较,该怎么办。这样做似乎不对:

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