如何使用 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#filter
with Arrow function 如下。
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(item){
return (item.bookings.price <= 80);
});
});
我想你想要的是这个:
var availableCars = _.filter(carsArray, function(car){
return _.every(car.bookings, function(booking) {
return booking.price <= 80;
});
});
我假设每辆车可以有多个预订,并且如果 none 的预订超过 80,您只需要 一辆车。
我想我会加入一些更接近要求的东西
我不想要价格 > 80 的汽车对象
function expensiveBooking(booking){
return booking.price > 80;
}
function carHasExpensiveBooking(car){
return _.some(car.bookings, expensiveBooking);
}
var result = _.reject(carsArray, carHasExpensiveBooking);
我只想根据条件拉出一个数组元素。
我尝试了 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#filter
with Arrow function 如下。
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(item){
return (item.bookings.price <= 80);
});
});
我想你想要的是这个:
var availableCars = _.filter(carsArray, function(car){
return _.every(car.bookings, function(booking) {
return booking.price <= 80;
});
});
我假设每辆车可以有多个预订,并且如果 none 的预订超过 80,您只需要 一辆车。
我想我会加入一些更接近要求的东西
我不想要价格 > 80 的汽车对象
function expensiveBooking(booking){
return booking.price > 80;
}
function carHasExpensiveBooking(car){
return _.some(car.bookings, expensiveBooking);
}
var result = _.reject(carsArray, carHasExpensiveBooking);