2

JavaScriptJQuery中是否有任何非基于循环的方法可以检查对象属性中是否存在某些 VALUE。我的意思是如果我有

obj = { prop1:val, prop2:val2 }

是否有可能通过一个语句检查val2是否存在于obj的值中?

更新1:这里的循环不是关键!如果它包含在一些JQuery预定义函数中,我可以使用循环!

更新 2: 我认为编写手工函数并不那么优雅。我想为这种常见和常见的问题找到一些基于库的解决方案。

4

4 回答 4

4

不,如果没有循环,您无法在一个语句中找到对象中是否存在值。

您可以使用本机 API 或库.. 但它们将在内部循环所有值。

任何其他方法的代价都将与迭代对象相同。所以我会编写一个简单的for循环来完成它。

我只需在我的脚本文件中编写这 4 行代码并包含该脚本文件而不是包含一个库.. 这将是相同的。http://jsfiddle.net/sQW4P/2/ <-- 如果你需要这样的功能。

于 2012-11-30T18:08:45.830 回答
1

这适用于 jQuery:

$.grep($.map(obj, function(v,k){return v}), function(el){return el == val2})

你可以像这样包装它:

function hasVal(o, v) {
  $.grep($.map(o, function(v,k){return v}), function(el){return el == v}).length > 0
}
于 2012-11-30T18:18:21.880 回答
1

如果你可以使用外部库,Underscore.js相当简洁:

_.contains(_.values(obj), "val2");
// true

这是 Underscore 的values方法:

返回对象属性的所有值。

这是源代码中的实现:

// Retrieve the values of an object's properties.
  _.values = function(obj) {
    var values = [];
    for (var key in obj) if (_.has(obj, key)) values.push(obj[key]);
    return values;
  };

如您所见,它只是遍历对象中的键,并将它们推送到数组中。所以,不,没有迭代就不可能做到这一点。

于 2012-11-30T18:20:50.650 回答
0

我能想到的唯一方法是 JSON:

new RegExp(':\"'+val+'\"').test(JSON.stringify(obj))

演示:http: //jsfiddle.net/J4TDS/

如果您可以使用函数,则无需查看库,只需几个字节:

function find(o, v) {
    for(var i in o) {
        if (o[i] === v) return true;
    }
}

find(obj, val2);
于 2012-11-30T18:11:54.397 回答