我不确定在对象数组中使用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解决方案或提示会很棒!
答案 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。
要解决此问题,您有两种选择:
迭代公司元素比较ID值,如果匹配则返回true,否则为false。
在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