繁体   English   中英

如何使用UnderscoreJS进行条件过滤

[英]How to conditional filter using UnderscoreJS

我只想根据条件提取一个数组元素。

我试图Underscore.js方法,如_.filter_.where方法,但我不能得到所需的输出。

为了更清楚起见,我不希望价格大于80的汽车对象。

我尝试使用下面的代码,并得到一个空数组:

var carsArray = [{
    "name": "Record1",
    "bookings": [{
        "price": 50,
        "actualPrice": 70,
    }]
}, {
    "name": "Record2",
    "bookings": [{
        "price": 60,
        "actualPrice": 100,
    }]
}, {
    "name": "Record3",
    "bookings": [{
        "price": 100,
        "actualPrice": 110,
    }]
}];

var availableCars = _.filter(carsArray, function (items) {
    return _.filter(items, function (cars) {
        return(cars.price <= 80);
    });
});

对于bookings数组中的多个元素

如果bookings数组中有多个元素,并且要检查是否有任何元素满足条件,则可以使用Array#some

carsArray.filter(car => car.bookings.some(booking => booking.price <= 80));

检查所有的汽车预订价格是否低于80 Array#every

carsArray.filter(car => car.bookings.every(booking => booking.price <= 80));

现场演示:

 var carsArray = [{ "name": "Record1", "bookings": [{ "price": 50, "actualPrice": 70, }, { "price": 40, "actualPrice": 70 }] }, { "name": "Record2", "bookings": [{ "price": 60, "actualPrice": 100, }, { "price": 90, "actualPrice": 160 }] }, { "name": "Record3", "bookings": [{ "price": 100, "actualPrice": 110, }, { "price": 120, "actualPrice": 200 }] }]; var atLeastOne = carsArray.filter(car => car.bookings.some(booking => booking.price <= 80)); var allCars = carsArray.filter(car => car.bookings.every(booking => booking.price <= 80)); document.getElementById('some').innerHTML = JSON.stringify(atLeastOne, 0, 4); document.getElementById('every').innerHTML = JSON.stringify(allCars, 0, 4); 
 <strong>For any of the car bookings less than or equal to 80</strong> <pre id="some"></pre> <hr /> <strong>For all of the car bookings less than or equal to 80</strong> <pre id="every"></pre> 


对于bookings数组中的单个元素

您可以将JavaScript Array#filterArrow函数一起使用 ,如下所示。

carsArray.filter(car => car.bookings[0].price <= 80);

 var carsArray = [{ "name": "Record1", "bookings": [{ "price": 50, "actualPrice": 70, }] }, { "name": "Record2", "bookings": [{ "price": 60, "actualPrice": 100, }] }, { "name": "Record3", "bookings": [{ "price": 100, "actualPrice": 110, }] }]; var filteredArr = carsArray.filter(car => car.bookings[0].price <= 80); console.log(filteredArr); document.getElementById('result').innerHTML = JSON.stringify(filteredArr, 0, 4); 
 <pre id="result"></pre> 


如果bookings数组中只有一个元素,则数据的格式可以更改为

var carsArray = [{
    "name": "Record1",
    "bookings": {
        "price": 50,
        "actualPrice": 70,
    }
}, {
    "name": "Record2",
    "bookings": {
        "price": 60,
        "actualPrice": 100,
    }
}, {
    "name": "Record3",
    "bookings": {
        "price": 100,
        "actualPrice": 110,
    }
}];

var filteredArr = carsArray.filter(car => car.bookings.price <= 80);

这是使用underscorejs的方法

var availableCars = _.filter(carsArray, function(car) {
    return _.any(car.bookings, function(booking) {
        return booking.price <= 80; 
    });
});

这是在es6中的操作方法

var availableCars = carsArray.filter(car => car.bookings.some(booking => booking.price <= 80));

这当然是如果汽车中可能有多个预订,并且至少有1个预订是<= 80个布克龙

我认为您想要的是:

var availableCars = _.filter(carsArray, function(car){
  return _.every(car.bookings, function(booking) {
    return booking.price <= 80;
  });
});

我假设每辆车可以有一个以上的预订,并且只有在所有预订都不超过80个的情况下,您才需要一辆车。

以为我会选择更接近要求的东西

我不想要价格> 80的汽车对象

function expensiveBooking(booking){
    return booking.price > 80;
}

function carHasExpensiveBooking(car){
    return _.some(car.bookings, expensiveBooking);
}

var result = _.reject(carsArray, carHasExpensiveBooking);

尝试这个:

var availableCars = _.filter(carsArray, function(item){
    return (item.bookings.price <= 80);
    });
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM