首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >节点中对象数组中的IndexOf

节点中对象数组中的IndexOf
EN

Stack Overflow用户
提问于 2012-12-24 02:40:20
回答 4查看 11.2K关注 0票数 2

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

不起作用的代码是:

代码语言:javascript
复制
if (res.locals.company.companies.indexOf(req.query.companyId) >= 0) return next()

if条件将始终返回false。

我还在控制台中进行了测试,实际上是错误的:

代码语言:javascript
复制
>> var zio = { __v: 1,
  _id: '50bc0238049a1ff10b000001',
  companies: 
   [ { _id: '50bc01938f164ee80b000001', name: 'Test' },
     { _id: '50bc01ac4e860ee90b000001', name: 'zio' } ],
}

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

而这应该是真的。

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

UPDATE/Clarification:我的目标只是检查其中一个if中是否存在50bc01938f164ee80b0001,我不需要知道它实际上在哪里。这是非常关键的性能!

Nodejs解决方案或提示将是惊人的!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-24 02:45:26

这没什么错。此Array不包含这样的字符串,而是只包含两个对象引用。因此,结果是正确的-1

要从包含搜索字符串值的对象引用中获取索引,我们可以如下所示

代码语言:javascript
复制
var index;
zio.companies.some(function( obj, idx ) {
    if( obj._id === '50bc01938f164ee80b000001' ) {
        index = idx;
        return true;
    }
});

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

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

代码语言:javascript
复制
var check = zio.companies.filter(function( obj ) {
    return obj._id === '50bc01938f164ee80b000001';
});

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

第二个编辑:如果您真的只是在性能之后,您可能不希望在任何搜索中有任何函数调用开销。我会用一些东西

代码语言:javascript
复制
function inObject(arr, search) {
    var len = arr.length;
    while( len-- ) {
        if(arr[len]._id === search)
           return true;
    }
}

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

该代码比这里提供的任何代码片段都要多几个数量级。看这里

票数 6
EN

Stack Overflow用户

发布于 2012-12-24 02:45:32

您需要循环这些元素并检查_id是否相等。

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

我确信节点有一些很好的方法可以做到这一点,但是裸JS的方法是:

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

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

代码语言:javascript
复制
function indexOf(arr, pred) {
    for (var i = 0; i < arr.length; ++i) {
        if (pred(arr)) {
            return i;
        }
    }
    return -1;
}

这将给您提供更详细的使用(和更糟糕的性能),但如果您发现自己需要经常这样做的话,它也可能更灵活一些。

代码语言:javascript
复制
console.log(indexOf(arr, function(elem) { return elem.foo === 'bar'; });
票数 0
EN

Stack Overflow用户

发布于 2012-12-24 02:48:31

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

要解决这个问题,您有两个选项:

  1. 迭代companies元素,比较ID值,如果匹配,则返回true否则为false。
  2. indexOf函数中使用带有所需id的对象作为参数。如果值大于-1,则返回true否则为false。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14016476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档