我从firebase查询返回结果。结果是具有不同属性的对象数组。这是我正在制作的汽车应用程序。每个对象看起来都是这样的
{
make: "make",
model: "model",
year: "year",
gas: "petrol",
mileage: "mileage",
images: {
image1: "url",
image2: "url"
}
}
我需要让用户能够优化这些结果,并且我试图提出一个强大的解决方案
问题: 我需要用户能够优化firebase查询的结果。 用户将为精确搜索选择不同的选项,因此我需要我的功能才能处理此
我在哪里
//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循环访问属性值,作为改进。[I]比较
没有意义我基本上想要遍历当前的结果,如果我在refinements对象中的所有值都相等,那么我想将此结果添加到我的新结果数组中。
感谢任何输入
答案 0 :(得分:2)
这样的事情可以解决问题:
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));
&#13;
使用的主要概念:
Array.filter
将当前结果过滤到仅与优化匹配的结果。Object.keys
来确定优化的密钥(make
,model
和year
),以便它可以使用{{3 (或注释掉Array.some
)。答案 1 :(得分:1)
我不确定您对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));
}
答案 2 :(得分:0)
使用过滤器,可以实现给定的要求,并且可以使用更多过滤业务逻辑传递函数作为大于,小于等的参数。试试看。
以下是实现相同目标的简单代码。
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);