JavaScript或JQuery中是否有任何非基于循环的方法可以检查对象属性中是否存在某些 VALUE。我的意思是如果我有
obj = { prop1:val, prop2:val2 }
是否有可能通过一个语句检查val2是否存在于obj的值中?
更新1:这里的循环不是关键!如果它包含在一些JQuery预定义函数中,我可以使用循环!
更新 2: 我认为编写手工函数并不那么优雅。我想为这种常见和常见的问题找到一些基于库的解决方案。
JavaScript或JQuery中是否有任何非基于循环的方法可以检查对象属性中是否存在某些 VALUE。我的意思是如果我有
obj = { prop1:val, prop2:val2 }
是否有可能通过一个语句检查val2是否存在于obj的值中?
更新1:这里的循环不是关键!如果它包含在一些JQuery预定义函数中,我可以使用循环!
更新 2: 我认为编写手工函数并不那么优雅。我想为这种常见和常见的问题找到一些基于库的解决方案。
不,如果没有循环,您无法在一个语句中找到对象中是否存在值。
您可以使用本机 API 或库.. 但它们将在内部循环所有值。
任何其他方法的代价都将与迭代对象相同。所以我会编写一个简单的for
循环来完成它。
我只需在我的脚本文件中编写这 4 行代码并包含该脚本文件而不是包含一个库.. 这将是相同的。http://jsfiddle.net/sQW4P/2/ <-- 如果你需要这样的功能。
这适用于 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
}
如果你可以使用外部库,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;
};
如您所见,它只是遍历对象中的键,并将它们推送到数组中。所以,不,没有迭代就不可能做到这一点。
我能想到的唯一方法是 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);