我不确定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:我的目标只是检查其中一个if中是否存在50bc01938f164ee80b0001,我不需要知道它实际上在哪里。这是非常关键的性能!
Nodejs解决方案或提示将是惊人的!
发布于 2012-12-24 02:45:26
这没什么错。此Array不包含这样的字符串,而是只包含两个对象引用。因此,结果是正确的-1。
要从包含搜索字符串值的对象引用中获取索引,我们可以如下所示
var index;
zio.companies.some(function( obj, idx ) {
if( obj._id === '50bc01938f164ee80b000001' ) {
index = idx;
return true;
}
});
console.log('index is: ', index);根据您的忍者编辑,如果您只想知道包含特定id的对象ref是否包含在该数组中,请使用它如下
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' ) ) {
}该代码比这里提供的任何代码片段都要多几个数量级。看这里
发布于 2012-12-24 02:45:32
您需要循环这些元素并检查_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'; });发布于 2012-12-24 02:48:31
您的companies似乎是一个对象数组(而不是ids),它将Id作为属性之一。indexOf函数用于查找匹配元素的索引。,因为您要传递一个ID值来搜索索引,所以它没有在数组中找到它作为元素,因此返回false。
要解决这个问题,您有两个选项:
indexOf函数中使用带有所需id的对象作为参数。如果值大于-1,则返回true否则为false。https://stackoverflow.com/questions/14016476
复制相似问题