我确定在javascript或jquery中内置了某种过滤功能,但我似乎无法弄清楚如何使用jquery filter()
有没有办法过滤具有特定值的javascript对象中的所有元素并返回对象?
我所追求的功能就是这样,虽然它不是很长,但我只是想知道是否有更简单的东西。
谢谢!
(function(){
var obj = {
a: true,
b: true,
c: false,
d: true,
e: true
},
f = [],
true_obj = {};
for (var i in obj){
if (obj[i] === true){
f.push(i);
}
}
for (var c = 0; c < f.length; c++){
true_obj[c] = f[c];
}
console.log(true_obj);
}());
答案 0 :(得分:2)
如何使用jQuery的内置map
方法? http://api.jquery.com/jQuery.map/
(function(){
var obj = {
a: true,
b: true,
c: false,
d: true,
e: true
},
f,
true_obj = {};
f = $.map(obj, function (val, key) {
return (val === true) ? key : null;
});
for (var c = 0; c < f.length; c++){
true_obj[c] = f[c];
}
console.log(true_obj);
}());
如果值不是map
/ null
,则undefined
回调中评估的值将添加到结果数组中。
另外,如果您要将f
数组复制到true_obj
,只需使用slice
(而不是for
循环) - https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/slice :
true_obj = f.slice(0);
<强>更新强>
如果您只想尝试过滤Object
中的项目,请尝试以下操作:
for (var key in obj) {
if (obj[key] !== true) {
delete obj[key];
}
}
如果您要复制它(也保留原始Object
),您可以使用:
var final_obj = {};
for (var key in obj) {
if (obj[key] === true) {
final_obj[key] = obj[key];
}
}
在其中任何一个中,如果你从:
开始var obj = {
a: true,
b: true,
c: false,
d: true,
e: true
};
你最终会
{
a: true,
b: true,
d: true,
e: true
}
(覆盖或复制)
答案 1 :(得分:1)
function filterObject(object, predicate) {
var result = {};
for(var prop in object) {
if(predicate(object[prop])) {
result[prop] = object[prop];
}
}
return result;
}
(function(){
var obj = {
a: true,
b: true,
c: false,
d: true,
e: true
};
var true_obj = filterObject(obj, function(item) {
return item === true;
});
console.log(true_obj);
}());
答案 2 :(得分:1)
如果你避免扩展原型,那就更好了。我的解决方案是:
我为obj对象创建了一个过滤方法,并使用HasOwnProperty()检查属性是否直接指向对象,或者它是否来自原型链。
(function(){
var obj = {
a: true,
b: true,
c: false,
d: true,
e: true
},
true_obj = {};
obj.filter = function (value) {
var result = [];
for (var key in this) {
if (this.hasOwnProperty(key)) {
if (this[key] === value){
result.push(key);
}
}
}
return result;
};
var f = obj.filter(true);
for (var c = 0; c < f.length; c++){
true_obj[c] = f[c];
}
console.log(true_obj);
}());
这是JSBIN
答案 3 :(得分:-1)
您可以简单地扩展JavaScript中Object
对象的原型以包含此类函数。
我不确定你想要什么样的filter
函数,但这是一个例子:
Object.prototype.filter = function(val){
for (var e in this) {
if (this[e] === val) delete this[e];
}
}
// Object.defineProperty(Object.prototype, "filter", { value:Object.prototype.filter, enumerable:false }); // this line will make the new method not enumerable, see discussion with Ian
// Example:
var obj = {a:"1", b:"2", c:"1"};
obj.filter("1");
alert(obj.a); // undefined