我有以下房地产Home对象的JavaScript数组:

var json = {
    'homes': [{
            "home_id": "1",
            "price": "925",
            "sqft": "1100",
            "num_of_beds": "2",
            "num_of_baths": "2.0",
        }, {
            "home_id": "2",
            "price": "1425",
            "sqft": "1900",
            "num_of_beds": "4",
            "num_of_baths": "2.5",
        },
        // ... (more homes) ...     
    ]
}

var xmlhttp = eval('(' + json + ')');
homes = xmlhttp.homes;

我想做的是能够对对象执行筛选,以返回"主"对象的子集.

例如,我希望能够基于pricesqftnum_of_bedsnum_of_baths进行过滤.

如何在JavaScript中执行以下伪代码:

var newArray = homes.filter(
    price <= 1000 & 
    sqft >= 500 & 
    num_of_beds >=2 & 
    num_of_baths >= 2.5 );

注意,语法不必与上面的完全相同.这只是一个例子.

推荐答案

您可以使用Array.prototype.filter方法:

var newArray = homes.filter(function (el) {
  return el.price <= 1000 &&
         el.sqft >= 500 &&
         el.num_of_beds >=2 &&
         el.num_of_baths >= 2.5;
});

实例:

var obj = {
    'homes': [{
            "home_id": "1",
            "price": "925",
            "sqft": "1100",
            "num_of_beds": "2",
            "num_of_baths": "2.0",
        }, {
            "home_id": "2",
            "price": "1425",
            "sqft": "1900",
            "num_of_beds": "4",
            "num_of_baths": "2.5",
        },
        // ... (more homes) ...     
    ]
};
// (Note that because `price` and such are given as strings in your object,
// the below relies on the fact that <= and >= with a string and number
// will coerce the string to a number before comparing.)
var newArray = obj.homes.filter(function (el) {
  return el.price <= 1000 &&
         el.sqft >= 500 &&
         el.num_of_beds >= 2 &&
         el.num_of_baths >= 1.5; // Changed this so a home would match
});
console.log(newArray);

这种方法是新ECMAScript 5th Edition标准的一部分,几乎可以在所有现代浏览器上找到.

对于IE,可以包括以下兼容性方法:

if (!Array.prototype.filter) {
  Array.prototype.filter = function(fun /*, thisp*/) {
    var len = this.length >>> 0;
    if (typeof fun != "function")
      throw new TypeError();

    var res = [];
    var thisp = arguments[1];
    for (var i = 0; i < len; i++) {
      if (i in this) {
        var val = this[i];
        if (fun.call(thisp, val, i, this))
          res.push(val);
      }
    }
    return res;
  };
}

Javascript相关问答推荐

如何在JavaScript中通过一次单击即可举办多个活动

了解Node.js中的EventEums和浏览器中的addEventEums之间的关系

使用JavaScript重新排序行

仅针对RTK查询中的未经授权的错误取消maxRetries

为什么当我解析一个promise时,输出处于挂起状态?

Chromium会将URL与JS一起传递到V8吗?

XSLT处理器未运行

无法使用单击按钮时的useState将数据从一个页面传递到另一个页面

如何将多维数组插入到另一个多维数组中?

在使用REACT更改了CSS类之后,无法更改CSS样式

如果一个字符串前面有点、空格或无字符串,后面有空格、连字符或无字符串,则匹配正则表达式

如何防止ionic 输入中的特殊字符.?

在JavaScript中,有没有一种方法可以迭代字符串的词法标记?

用Reaction-RT-Chart创建实时条形图

ComponentWillReceiveProps仍在React 18.2.0中工作

在此div中添加一个类,并在一段时间后在Java脚本中将其删除

REACT-本机错误:错误类型错误:无法读取未定义的容器的属性

如何从Reaction-Redux中来自API调用的数据中筛选值

带元素数组的Mongo聚合

Js问题:有没有办法将数据从标记表转换成图表?