过滤javascript对象的结果

时间:2013-04-02 20:47:21

标签: javascript jquery

我确定在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);

}());

JSBIN

4 个答案:

答案 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);
}());

http://jsfiddle.net/gVZVL/

如果值不是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);

http://jsfiddle.net/gVZVL/1/

<强>更新

如果您只想尝试过滤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