我目前有这个代码,它返回与personid匹配的索引。它运作得很好。
但是我需要扩展一些。我的对象还包括jobid
。我需要这个来查找personid
和jobid
。有没有办法用indexOf
执行此操作,还是需要遍历我的对象才能找到正确的元素?
pos = eventObjs.map(function (e) { return e.familymemberpersonid; }).indexOf($(element).attr('familymemberpersonid'));
假设我有一个具有2个属性的对象: personId和jobId
[0]
personId: 1, jobId: 1
[1]
personId: 2, jobId: 1
[2]
personId: 1, jobId: 2
[3]
personId: 2, jobId: 2
如果我知道它是personId,我想返回索引[1]:2 AND jobId:1
答案 0 :(得分:3)
如indexOf
的文档中所述:“ indexOf()使用严格相等(使用===或三重等于运算符的相同方法)将searchElement与Array的元素进行比较。“因此,您将无法使用它匹配数组项的对象属性。您需要的是find
或findIndex
。但是两者都只能在ECMA6中使用,因此您需要使用文档中提到的其中一种填充物。
使用findIndex
的示例:
pos = eventObjs.findIndex(function (e) { return e.personId === 2 && e.jobId === 1; });
答案 1 :(得分:1)
您可以考虑连接这两个值,这样您只需要搜索一个字符串,例如:
var pos = eventObjs.map(function (e) {
return e.familymemberpersonid + ':' + e.familymemberjobid;
}).indexOf(element.getAttribute('familymemberpersonid') + ':' +
element.getAttribute('familymemberjobid'));
你应该可以使用ES5的Array.prototype.some,它会在找到匹配后立即返回。
var pos = (function() {
// To store current position outside callback
var pos;
// Store element attribute values
var pID = element.getAttribute('familymemberpersonid');
var jID = element.getAttribute('familymemberjobid');
// Returns true when first match is found
var found = eventObjs.some(function (e, i) {
pos = i;
return e.familymemberpersonid == pID && e.familymemberjobid == jID;
};
// If match found, return position. Otherwise, return null (or whatever value suits)
return found? pos : null;
}());