0

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

4 回答 4

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将添加到结果数组中。nullundefined

此外,如果您希望将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
}

(覆盖或复制)

于 2013-04-02T20:56:32.947 回答
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);

}());
于 2013-04-02T21:05:25.650 回答
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

于 2013-04-02T21:06:23.940 回答
-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
于 2013-04-02T20:53:41.573 回答