indexOf有2个参数

时间:2015-04-08 03:33:15

标签: javascript

我目前有这个代码,它返回与personid匹配的索引。它运作得很好。

但是我需要扩展一些。我的对象还包括jobid。我需要这个来查找personidjobid。有没有办法用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

2 个答案:

答案 0 :(得分:3)

indexOf的文档中所述:“ indexOf()使用严格相等(使用===或三重等于运算符的相同方法)将searchElement与Array的元素进行比较。“因此,您将无法使用它匹配数组项的对象属性。您需要的是findfindIndex。但是两者都只能在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;
         }());