如果列表中存在值,我使用grep和map函数来获取对象,但它不能正常工作。
我有一个列表customList,customObject具有int id属性和List值属性。
customobject[0].id
customObject[0].value[]
我想要的是检查列表中是否存在值5。
我正在使用的功能是:
var gettedcustomObject = $.grep(customList, function (e) {
var result = e.Value.map(function (a) { return a === 5;});
return result;
});
我做错了什么,正确的实施是什么?
注意:2x foreach可能是一个解决方案,但customList有超过1000个具有10000个值的对象。我认为这会减慢过程。
答案 0 :(得分:0)
这应该这样做。
var gettedcustomObject = customList.filter(function(v){
var ln = v.Value.length;
for(var i = 0; i < ln; i++){
if(v.Value[i] == 5){
return true;
}
}
return false;
// Or simply:
// return v.Value.indexOf(5) != -1;
});
如果v.Value
是一个数组,这将有效。
答案 1 :(得分:0)
您应该查看some
:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some#Polyfill
比其他方法更快,例如filter
,map
或sort
,就像为此设计的那样。
//List to work against
var arr = [];
//Populate
while (arr.length < 9999999) {
arr.push(Math.random() * 999999)
}
//Set element to find
arr[10] = "test";
//Begin timing
var d = new Date().getTime();
//Run filter
console.log(arr.filter(function(a){return a === "test"}).length > 0);
//How long did it take
console.log("`filter` took:",new Date().getTime() - d,"ms")
//Begin timing
d = new Date().getTime();
//Run filter
console.log(arr.some(function(a){return a === "test"}));
//How long did it take
console.log("`some` took:",new Date().getTime() - d,"ms")
&#13;
<script>
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some#Polyfill
// Production steps of ECMA-262, Edition 5, 15.4.4.17
// Reference: http://es5.github.io/#x15.4.4.17
if (!Array.prototype.some) {
Array.prototype.some = function(fun/*, thisArg*/) {
'use strict';
if (this == null) {
throw new TypeError('Array.prototype.some called on null or undefined');
}
if (typeof fun !== 'function') {
throw new TypeError();
}
var t = Object(this);
var len = t.length >>> 0;
var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
for (var i = 0; i < len; i++) {
if (i in t && fun.call(thisArg, t[i], i, t)) {
return true;
}
}
return false;
};
}
</script>
&#13;
答案 2 :(得分:0)
如果您的目标是在5
媒体资源中找到包含Value
的列表中的第一个对象,那么您正在寻找Array#find
和Array#indexOf
:
var gettedcustomObject = customList.find(function(entry) {
return entry.Value.indexOf(5) != -1;
});
请注意,Array#find
最近才添加,因此您可能需要填充(这是微不足道的)。 MDN has one
或者您可以使用Array#includes
代替indexOf
,这将是在ES2017中并且也是可填充的:
var gettedcustomObject = customList.find(function(entry) {
return entry.Value.includes(5);
});
实例(使用indexOf
):
var customList = [
{
note: "I'm not a match",
Value: [2, 3, 4]
},
{
note: "I'm not a match either",
Value: [78, 4, 27]
},
{
note: "I'm a match",
Value: [889, 5, 27]
},
{
note: "I'm also a match, but you won't find me",
Value: [4, 6, 5]
}
];
var gettedcustomObject = customList.find(function(entry) {
return entry.Value.indexOf(5) != -1;
});
console.log(gettedcustomObject);
&#13;
如果与Value
内的项匹配的逻辑更复杂,则您使用Array#some
和回调函数比indexOf
更高。但是在查看基于===
,indexOf
或新Array#includes
的数组中的条目数组是否可行时。
答案 3 :(得分:0)
使用Array.some()和Array.indexOf()的一种方法。一旦发现元素,就会发生一些循环中断
var gettedcustomObject;
customobject.some(function(obj){
if(obj.value.indexOf(5) >-1){
gettedcustomObject = obj;
return true;
}
});