从javascript对象中过滤结果

filter results out of a javascript object

本文关键字:过滤 结果 对象 javascript      更新时间:2023-09-26

我确信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

如何使用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/

如果值不是null/undefined,则在map回调中计算的值将被添加到结果数组中。

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

(覆盖或复制)

最好避免扩展原型。我的解决方案是:

我创建了一个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

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

您可以简单地扩展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