Underscore JS,在数组中查找包含值的对象

Underscore JS, find object which contains value in array

我正在寻找一种解决方案来查找 json 对象,该对象包含 b 中的值。示例:在 b 中查找包含 "jinx" 的对象。

示例数据。 [{ id:1 一个:"karma", b:["jinx","caitlyn","tristana"] }, {....}, {....}]

我知道下划线对 key/value 对效果更好,但这会很有帮助。

谢谢。

这将为您提供一个对象数组 out,其中包含数组 in 中的所有项目,其中 b 包含元素 jinx:

var in = [...];

var out = _.filter(in, function(item) {
   return _.contains(item.b, 'jinx');
});

这是我在纯 js 中的回答:

if(sample_data['b'].indexOf("jinx") != -1){
    console.log("Object in b contains jinx");
}

如果您需要支持旧版浏览器,您可以使用这个 polyfill

Array.prototype.indexOf || (Array.prototype.indexOf = function(d, e) {
    var a;
    if (null == this) throw new TypeError('"this" is null or not defined');
    var c = Object(this),
        b = c.length >>> 0;
    if (0 === b) return -1;
    a = +e || 0;
    Infinity === Math.abs(a) && (a = 0);
    if (a >= b) return -1;
    for (a = Math.max(0 <= a ? a : b - Math.abs(a), 0); a < b;) {
        if (a in c && c[a] === d) return a;
        a++
    }
    return -1
});

编辑:

既然你说你的数据是这样的

data=[{ id:1 ,a:"karma", b:["jinx","caitlyn","tristana"] }, {1:2}, {1:2}]
//between 1 and a you forgot ,

那你用的就是

if(data[0]['b'].indexOf("jinx") != -1){
    console.log("Object in b contains jinx");
}

Underscore.js 有一个 .contains() 方法,在这种情况下可能很有用。如果您只关心搜索对象的 b 键,那么以下方法可行:

var sampleData = { id:1, a:"karma", b:["jinx","caitlyn","tristana"] };

if (_.contains(sampleData.b, 'jinx') {
  // Found
} else {
  // Not found
}

根据您的评论,这是一个修订版。这使用 Underscore 的 .filter 方法将数组过滤为 b 键控数组中包含 jink 的数组。

var sampleData = [
  { id:1, a:"karma", b:["jinx","caitlyn","tristana"] },
  { id:2, a:"karma", b:["kinx","caitlyn","tristana"] },
  { id:3, a:"karma", b:["linx","caitlyn","tristana"] },
  { id:4, a:"karma", b:["minx","caitlyn","tristana"] },
  { id:5, a:"karma", b:["ninx","caitlyn","tristana"] },
  { id:6, a:"karma", b:["jinx","caitlyn","tristana"] },
  { id:7, a:"karma", b:["pinx","caitlyn","tristana"] },
  { id:8, a:"karma", b:["qinx","caitlyn","tristana"] },
  { id:9, a:"karma", b:["rinx","caitlyn","tristana"] }
];

var findJinx = function(data) {
  return _.first(_.filter(data, function(item) {
    if (_.contains(item.b, 'jinx')) {
      return item;
    }
  }));
}

console.log(findJinx(sampleData));

如果您想使用 underscore,您可以使用 _.each 遍历您的对象列表,然后使用 _.indexOf 检查每个对象中的每个 b array像这样: http://jsfiddle.net/rkamelot6262/BwHxv/378/