我正在返回一个firebase查询的结果。结果是一个具有不同属性的对象数组。这是我正在制作的一款汽车应用。每个对象看起来都是这样的
{
make: "make",
model: "model",
year: "year",
gas: "petrol",
mileage: "mileage",
images: {
image1: "url",
image2: "url"
}
}我需要让用户能够改进这些结果,并且我正在努力想出一个健壮的解决方案
问题:我需要用户能够改进防火墙查询的结果。用户将选择不同的选项进行精细搜索,因此我需要我的功能来处理这个问题。
,在那里我要去
//Heres' how I planned to pass the refinement options
refinements = {
make: 'value',
model: 'value',
year: 'value'
}
//currentResults is an array of objects with different properties
const refineResults = (currentResults, refinements) => {
newResults = [];
for (int i = 0; i < currentResults.count; i++ ){
let currentResult = currentResult[i];
for(int i = 0; i < refinements.count; i++){
}
}
}我知道我对这个函数没有太大的兴趣,但我甚至不确定我是否以正确的方式来处理这个问题。作为改进,我不知道如何通过for循环访问属性值。
基本上,我想循环我当前的结果,如果我在细化对象中的所有值都相等,那么我想将这个结果添加到我的新结果数组中。
谢谢您的意见
发布于 2018-03-05 15:56:25
像这样的东西会起作用的:
refinements = {
make: 'Toyota',
model: 'RAV4',
year: '2010'
}
var currentResults = [
{ make: 'Toyota', model: 'Matrix', year: '2012' },
{ make: 'Toyota', model: 'RAV4', year: '2010' },
{ make: 'Chevrolet', model: 'Matiz', year: '2000' }
];
//currentResults is an array of objects with different properties
const refineResults = (currentResults, refinements) => {
return currentResults.filter((car) => {
/*var result = true;
Object.keys(refinements).forEach(refinement => {
if (car[refinement] !== refinements[refinement]) result = false;
});
return result;*/
return !Object.keys(refinements).some(refinement => car[refinement] !== refinements[refinement]);
});
}
console.log(refineResults(currentResults, refinements));
使用的主要概念:
Array.filter将当前的结果过滤为只匹配精化的结果。Object.keys来确定细化的键(make、model和year),这样它就可以用Array.some (或注释掉的Array.forEach)循环它们。*
发布于 2018-03-05 15:55:14
我不太清楚您期望refinements对象如何工作,但我假设您需要每个结果中的每个属性在每个result中相等于它们的相应属性。在这种情况下,下面的refineResults函数将有所帮助。
// helper func, returns true only if all props on `refinements` match their counterparts on `result`
function matchesAll(refinements, result) {
for (const key in refinements) {
if (refinements[key] !== result[key]) {
return false;
}
}
return true;
}
// returns filtered list of results
function refineResults(currentResults, refinements) {
return currentResults.filter(result => matchesAll(refinements, result));
}发布于 2018-03-05 15:53:56
使用过滤器,就可以满足给定的要求,并且可以使用更多的过滤业务逻辑来传递函数,例如大于、小于和更多的参数。试试看。
下面是实现相同目标的简单代码。
var results = [
{name:"john",age:15,price:400},
{name:"joe",age:25,price:450},
{name:"johnson",age:35,price:500}
];
var refine = {name:"john",age:15};
var result = results.filter(function(val){
return val.name === refine.name && val.age == refine.age;
});
console.log(result);
https://stackoverflow.com/questions/49114051
复制相似问题