细化数组的结果

时间:2018-03-05 15:37:28

标签: javascript reactjs firebase-realtime-database

我从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对象中的所有值都相等,那么我想将此结果添加到我的新结果数组中。

感谢任何输入

3 个答案:

答案 0 :(得分:2)

这样的事情可以解决问题:

&#13;
&#13;
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;
&#13;
&#13;

使用的主要概念:

  • 代码使用Array.filter将当前结果过滤到仅与优化匹配的结果。
  • 代码使用Object.keys来确定优化的密钥(makemodelyear),以便它可以使用{{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);