2016-07-15 85 views
2

我有一個約30個對象的json數組。下面是一個來自陣列的示例對象:基於匹配數據的數組返回對象

{ 
    "id": 0, 
    "name": "Valle", 
    "activities": "night-life", 
    "food": "fancy-food", 
    "sport" : "baseball", 
    "geoProfile": "artsy", 
    "priority": 2 
} 

我正在構建基於用戶輸入的頁面上的另一個對象。用戶將單選按鈕之間進行選擇,並在他們做出選擇後,我將有一個對象,如:

{geoProfile: "artsy", activities: "nature", food: "fancy-food", sport: "cricket"} 

我使用jQuery的$.each()方法要經過的每個對象如下:

$.each(self.data(), function (i, s) { 
    if (s.geoProfile == self.prefLocation() && 
     s.activities == self.prefActivity() && 
     s.food == self.prefFood() && 
     s.sport == self.prefSport()) { 
     optionMatched = s; 
     return false; 
    } 
}); 

這將返回一個包含全部四個匹配項的對象,但是如何返回與用戶構建的對象匹配度最高的json對象?如果兩個匹配,我想再查看「優先級」屬性並返回優先級最低的屬性。

+0

對於初學者來說,你需要通過你的陣列迭代和他們的價值觀比較用戶輸入的內容。你試過什麼了? –

+0

@MikeC查看上面的編輯,感謝回覆 – JordanBarber

回答

3

您可以使用Array#map並用匹配屬性的總和構建一個新數組。

稍後您可以sort with map並使用結果進行排序並獲取第一個元素。

var data = [/* your data here */], 
    search = { geoProfile: "artsy", activities: "nature", food: "fancy-food", sport: "cricket" }, 
    result = data.map(function (a, i) { 
     return { 
      count: Object.keys(search).reduce(function (r, k) { return r + +(a[k] === search[k]); }, 0), 
      priority: a.priority, 
      index: i 
     } 
    }); 

result.sort(function (a, b) { 
    return b.count - a.count || a.priority - b.priority; 
}); 

單迴路解決方案

var data = [/* your data here */], 
    search = { geoProfile: "artsy", activities: "nature", food: "fancy-food", sport: "cricket" }, 
    result = data.reduce(function (r, a, i) { 
     document.write('<pre>' + JSON.stringify(r, 0, 4) + '</pre><hr>'); 
     var o = { 
      count: Object.keys(search).reduce(function (q, k) { return q + +(a[k] === search[k]); }, 0), 
      priority: a.priority, 
      index: i 
     }; 
     if (!i || o.count > r[0].count || o.count === r[0].count && o.priority < r[0].priority) { 
      return [o]; 
     } 
     o.count === r[0].count && o.priority === r[0].priority && r.push(o); 
     return r; 
    }, []); 
+0

感謝您的回覆。我想我明白。所以在你的例子中,'data'是我的json對象,'search'是用戶創建的對象? – JordanBarber

+0

沒錯。數據將數組與您擁有的對象保存在一起,並且搜索是需要查找的部分。 –

+0

這是否考慮到優先級值? –

0

只是跟蹤匹配的數量和更新您選擇的基礎上,如果有更多的比賽之一。

var numOfMatches = 0; 
$.each(self.data(), function(i, s) { 
    var matchingProperties = 0; 
    if (s.geoProfile == self.prefLocation()) { 
    matchingProperties++; 
    } 
    if (s.activities == self.prefActivity()) { 
    matchingProperties++; 
    } 
    if (s.food == self.prefFood()) { 
    matchingProperties++; 
    } 
    if (s.sport == self.prefSport()) { 
    matchingProperties++; 
    } 

    if (matchingProperties === 0 || matchingProperties < numOfMatches) { 
    return; 
    } 

    if (!optionMatched // Grab the first match 
     || matchingProperties > numOfMatches // or if more properties match 
     || s.priority < optionMatched.priority) { // or the one with a lower priority 
    optionMatched = s; 
    numOfMatches = matchingProperties; 
    } 
}); 

或者你可以使用簡化的filter初始計數:

var numOfMatches = 0; 
$.each(self.data(), function(i, s) { 
    var matchingProperties = [ 
    s.geoProfile == self.prefLocation(), 
    s.activities == self.prefActivity(), 
    s.food == self.prefFood(), 
    s.sport == self.prefSport() 
    ].filter(function(val) { return val; }).length; 

    if (matchingProperties === 0 || matchingProperties < numOfMatches) { 
    return; 
    } 

    if (!optionMatched // Grab the first match 
     || matchingProperties > numOfMatches // or if more properties match 
     || s.priority < optionMatched.priority) { // or the one with a lower priority 
    optionMatched = s; 
    numOfMatches = matchingProperties; 
    } 
});