如果list <object>值存在则返回对象(Javascript,jquery grep / map)

时间:2016-09-29 14:34:01

标签: javascript jquery list

如果列表中存在值,我使用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个值的对象。我认为这会减慢过程。

4 个答案:

答案 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)

您应该查看somehttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some#Polyfill

比其他方法更快,例如filtermapsort,就像为此设计的那样。

&#13;
&#13;
//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;
&#13;
&#13;

答案 2 :(得分:0)

如果您的目标是在5媒体资源中找到包含Value的列表中的第一个对象,那么您正在寻找Array#findArray#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):

&#13;
&#13;
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;
&#13;
&#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;
  }
});