Node中对象数组中的IndexOf

时间:2012-12-24 02:40:20

标签: javascript node.js

我不确定在对象数组中使用indexOf

无效的代码是:

if (res.locals.company.companies.indexOf(req.query.companyId) >= 0) return next()

if条件将始终返回false。

我也在控制台中测试过它实际上是错误的:

>> var zio = { __v: 1,
  _id: '50bc0238049a1ff10b000001',
  companies: 
   [ { _id: '50bc01938f164ee80b000001', name: 'Test' },
     { _id: '50bc01ac4e860ee90b000001', name: 'zio' } ],
}

>> zio.companies.indexOf("50bc01938f164ee80b000001")
-1

然而它应该是真的。

我应该使用任何神秘的下划线实用程序吗?

UPDATE / Clarification:我的目的只是检查其中一个ID中是否存在50bc01938f164ee80b000001,我不需要知道它实际上在哪里。这非常重要!

Nodejs解决方案或提示会很棒!

4 个答案:

答案 0 :(得分:6)

没错。那个 Array 不包含这样的 String ,但只包含两个 Object引用。因此,结果是正确-1

要从对象引用中获取包含搜索到的字符串值的索引,我们可以像

一样
var index;
zio.companies.some(function( obj, idx ) {
    if( obj._id === '50bc01938f164ee80b000001' ) {
        index = idx;
        return true;
    }
});

console.log('index is: ', index);

根据您的忍者编辑,如果您只是想知道该数组是否包含对象引用特定的 id ,请使用它

var check = zio.companies.filter(function( obj ) {
    return obj._id === '50bc01938f164ee80b000001';
});

if( check.length ) {
    console.log('yep');
} else {
    console.log('nope');
}

第二次编辑:如果您真的只是在演出之后,您可能不希望在任何搜索中都有函数调用开销。我会使用像

这样的东西
function inObject(arr, search) {
    var len = arr.length;
    while( len-- ) {
        if(arr[len]._id === search)
           return true;
    }
}

if( inObject( zio.companies, 'AAA' ) ) {
}

该代码超出此处提供的任何代码段几个级别。 See Here

答案 1 :(得分:0)

您需要遍历元素并检查_id是否相等。

indexOf检查严格相等,这些对象当然不等于该字符串。 (它与"hello" === {foo: "hello"}的逻辑相同。这将永远是错误的。)

我确信节点有一些奇特的方法可以做到这一点,但是裸露的JS方式是:

var i,
    arr = [{foo: 'bar'}, {foo: 'baz'}],
    idx = -1;
for (i = 0; i < arr.length; ++i) {
    if (arr[i].foo === 'bar') {
        idx = i;
        break;
    }
}

您还可以轻松将其转换为函数:

function indexOf(arr, pred) {
    for (var i = 0; i < arr.length; ++i) {
        if (pred(arr)) {
            return i;
        }
    }
    return -1;
}

这会给你提供更多冗长的用法(性能稍差),但如果你发现自己需要经常这样做,它也可能会更灵活。

console.log(indexOf(arr, function(elem) { return elem.foo === 'bar'; });

答案 2 :(得分:0)

您的companies似乎是一个对象数组(而不是ID),其中Id作为其中一个属性。 indexOf函数用于查找匹配元素的索引。 由于您传递的是ID值来搜索索引,因此它没有将其作为数组中的元素找到,因此返回false。

要解决此问题,您有两种选择:

  1. 迭代公司元素比较ID值,如果匹配则返回true,否则为false。

  2. indexOf函数中将具有所需id的对象用作参数。如果value大于-1,则返回true,否则返回false。

答案 3 :(得分:0)

.indexOf正在返回正确的输出;您的数组没有包含该字符串的元素。实际上,它是一个包含两个对象文字的数组。对于对象,您不需要.indexOf,而是我们必须创建自己的函数:

 var inObject = function( object, val ) {

     for (var i in object) { if ( object.hasOwnProperty(i) ) {

             if ( obj[i] === val ) {

                 return true;
             }

         }

     }
     return false;
 };

>>> inObject( zio.companies[0], '50bc01938f164ee80b000001' );
    : true