JavaScript:如何创建一个Object并过滤这些属性?

10 html javascript json filter

我有一系列像这样的房子,

{
    "homes" : [{
        "home_id"         : "1",
        "address"         : "321 Main St",
        "city"            : "Dallas",
        "state"           : "TX",
        "zip"             : "75201",
        "price"           : "925",
        "sqft"            : "1100",
        "year_built"      : "2008",
        "account_type_id" : "2",
        "num_of_beds"     : "2",
        "num_of_baths"    : "2.0",
        "geolat"          : "32.779625",
        "geolng"          : "-96.786064",
        "photo_id"        : "14",
        "photo_url_dir"   : "\/home_photos\/thumbnail\/2009\/06\/10\/"
    }],
    ..........
}
Run Code Online (Sandbox Code Playgroud)

我想提供3种不同的搜索方法.

如何返回此家庭区域数组的子集:

  • priceX和Y之间
  • 所述bathrooms> = Z
  • #bedrooms= = A或== B或== C.

例如,我如何创建psuedo代码,如:

homes.filter {price >= 150000, price <= 400000, bathrooms >= 2.5, bedrooms == 1 | bedrooms == 3}
Run Code Online (Sandbox Code Playgroud)

use*_*291 15

Javascript 1.6(FF,基于Webkit)具有内置的Array.filter功能,因此无需重新发明轮子.

result = homes.
  filter(function(p) { return p.price >= 150000 }).
  filter(function(p) { return p.price <= 400000 }).
  filter(function(p) { return p.bathrooms >= 2.5 }) etc
Run Code Online (Sandbox Code Playgroud)

对于msie后备,请参阅上面链接的页面.


小智 5

看看JSONPath http://code.google.com/p/jsonpath/

像jsonPath(json,"$ .. homes [?(@.price <400000)]").toJSONString()之类的东西应该可行.

JAQL对于过滤JSON也很有趣. http://www.jaql.org/


Jam*_*mes 5

干得好:

var filteredArray = filter(myBigObject.homes, {

    price: function(value) {
        value = parseFloat(value);
        return value >= 150000 && value <= 400000;
    },

    num_of_baths: function(value) {
        value = parseFloat(value);
        return value >= 2.5;
    },

    num_of_beds: function(value) {
        value = parseFloat(value);
        return value === 1 || value === 3;
    }

});
Run Code Online (Sandbox Code Playgroud)

filter功能:

function filter( array, filters ) {

    var ret = [],
        i = 0, l = array.length,
        filter;

    all: for ( ; i < l; ++i ) {

        for ( filter in filters ) {
            if ( !filters[filter](array[i][filter]) ) {
                continue all;
            }
        }

        ret[ret.length] = array[i];

    }

    return ret;

}
Run Code Online (Sandbox Code Playgroud)


Rya*_*nch 2

看一下jQuery库中的$.grep函数。即使您不使用该库,您也可以查看代码并了解它们如何完成您想要执行的任务。

编辑:这是一些代码:

 function filter(houses, filters) // pass it filters object like the one in @J-P's answer
 {
      retArr = $.grep(houses, 
           function(house)
           {
                for(var filter in filters)
                {
                     function test = filters[filter];
                     if(!test(house)) return false;
                }
                return true;
           });

      return retArr;
 }
Run Code Online (Sandbox Code Playgroud)

  • 这里我想起了一句话:“如果你只有一把锤子,你往往会把所有问题都视为钉子。” - jQuery 和 $.grep 似乎与这个问题无关。如果我错了,请随时纠正我。这个问题似乎更多的是关于数据结构的迭代。 (2认同)