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

3

我正在寻找一种解决方案,以查找包含b值的json对象。例如:查找包含“jinx”的对象。

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

我知道underscore在键/值对方面工作得更好,但这将是很大的帮助。

谢谢。


不太清楚,样本数据是一个变量,那么对于 sample_data[b].indexOf("jinx"),如果返回 -1,则意味着 b 不包含 jinx。 - Marko Mackic
让我试一下并更新。谢谢。 - swanson_ron
我已经在回答中解释了我的意思 :) 因为在评论中可能不够清楚 :) - Marko Mackic
Marko,每个数组对象的格式为“{ id:1 a:"karma", b:["jinx","caitlyn","tristana"] }”。如果这有帮助,请告诉我。 - swanson_ron
告诉我,示例数据的第一个实例字符串是否等于 "{ id:1 a:"karma", b:["jinx","caitlyn","tristana"] }",因为如果它是像你所说的对象,那么在 1 和 a 之间就不能没有逗号,否则它代表什么。 - Marko Mackic
4个回答

3

这将会返回一个包含所有来自数组 inb 包含元素 jinx 的对象的数组 out

var in = [...];

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

工作正常,谢谢!唯一的抱怨是它返回一个对象数组而不仅仅是对象。有什么想法吗?响应= [对象] 而不仅仅是对象。 - swanson_ron
如果你只对第一个结果感兴趣,将“_.filter”替换为“_.find”。 - TimoStaudinger

2

2

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));

这段代码适用于单个对象,但我忘了提到我的数据是一个数组。变量sampleData = [{ id:1, a:"karma", b:["jinx","caitlyn","tristana"] }, {...}, {...}] - swanson_ron
工作正常,谢谢!唯一的抱怨是它返回一个对象数组而不仅仅是对象。有什么想法吗?响应= [对象] 而不仅仅是对象。 - swanson_ron
那么你只期望找到一个单词实例吗?也就是说,只有一个对象会包含“jinx”。 - Brett DeWoody
1
如果你只知道结果数组中包含一个对象,那么你可以简单地返回第一个元素。我已经使用Underscores的_.first方法更新了解决方案。 - Brett DeWoody

1
这是我的纯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");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接