Node中对象数组中的IndexOf

pig*_*ack 2 javascript node.js

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

不起作用的代码是:

if (res.locals.company.companies.indexOf(req.query.companyId) >= 0) return next()
Run Code Online (Sandbox Code Playgroud)

if条件总是返回false.

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

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

>> zio.companies.indexOf("50bc01938f164ee80b000001")
-1
Run Code Online (Sandbox Code Playgroud)

而它应该是真的.

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

更新/澄清:我的目的是检查其中一个ID中是否存在50bc01938f164ee80b000001,我不需要知道它实际上在哪里.这非常重要!

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

jAn*_*ndy 6

这没错.该Array不包含类似的String,但只包含两个Object引用.因此,结果是正确的-1.

要从包含搜索到的字符串值Object引用中获取索引,我们可以这样做

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

console.log('index is: ', index);
Run Code Online (Sandbox Code Playgroud)

基于你的忍者编辑,如果你只是想知道该数组是否包含一个持有特定id的对象,请像使用它一样

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

if( check.length ) {
    console.log('yep');
} else {
    console.log('nope');
}
Run Code Online (Sandbox Code Playgroud)

第二次编辑:如果你真的只是在演出之后,你可能不希望在任何搜索中都有任何函数调用开销.我会用类似的东西

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

if( inObject( zio.companies, 'AAA' ) ) {
}
Run Code Online (Sandbox Code Playgroud)

该代码超出了此处提供的任何代码段数量级.看这里