2016-01-31 27 views
0

我有一個萬多對象代表的一些信息的兩個ids看起來像:如何構建基於兩個鍵查找在Javascript

muchData = [ 
    { 
     ids: ["123", "234"], 
     interestingData: 1 
    }, 
    { 
     ids: ["123", "345"], 
     interestingData: 2 
    }, 
    ... 
]; 
我目前使用lodash找到一個對象

那匹配兩個ids等:

function findData(id1, id2) { 
    return _.filter(muchData, function(d) { 
     return d.ids.indexOf(id1) > -1 && d.ids.indexOf(id2) > -1 
    }) 
} 

那裏沒有我將接收ID1和ID2的次序的保證(即,ids陣列中的第一值可以是任一或ID1 ID2)。

有沒有更好的方式來表示這個問題,以避免每次查找都要過濾整個muchData數組?

+0

你需要多少次調用'findData'?重構數據是否值得? – Derlin

+0

客戶端上可能有50多次。它有助於在用戶使用不同的過濾器時填充信息行。每次應用過濾器時,我都可以從服務器獲取數據,但所有其他數據都已經在客戶端上,我試圖避免這種往返。我很樂意重組數據,但最好將所有內容都保存在客戶端。 –

+1

是否有'id'屬性值(數組中的那些)保證唯一?如果是這樣的話,我會建議將各個ID結合在一起(從id:[「123」,「234」]到'id:「123234」'),然後搜索,然後通過組合的屬性值*或*創建一個數組並使用組合鍵作爲索引(儘管這可能會創建一個包含許多空/未定義條目的非常大的數組)。但是,如果沒有保證的唯一值,那麼您僅限於搜索,因爲您已經*或*必須重新設計後端以保證唯一的'id'屬性值... –

回答

0

你可以拿一個散列表。使用唯一鍵的排序ID。

var muchData = [{ ids: ["123", "234"], interestingData: 1 }, { ids: ["123", "345"], interestingData: 2 }, ], 
 
    hash = muchData.reduce(function (r, a, i) { 
 
     var k = a.ids[0] < a.ids[1] ? a.ids[0] + '|' + a.ids[1] : a.ids[1] + '|' + a.ids[0]; 
 
     r[k] = r[k] || []; 
 
     r[k].push(a); 
 
     return r; 
 
    }, {}); 
 

 
document.write('<pre>' + JSON.stringify(hash, 0, 4) + '</pre>');

1

原本是(詳細)評論,略微擴大到答案。

考慮到陣列的性質:

muchData = [ 
    { 
     ids: ["123", "234"], 
     interestingData: 1 
    }, 
    { 
     ids: ["123", "345"], 
     interestingData: 2 
    }, 
    ... 
]; 

如果真如你在your comment to the question說:

的ID保證是唯一的。

那麼最簡單的方法是使用組合id屬性值作爲數組的索引:

var sortedData = [], 
    muchData.forEach(function (obj, index, array) { 
     sortedData[ parseInt(obj.id.join(''), 10) ] = obj.interestingData; 
    }); 

,然後使用創建數組來搜索想要檢索的interestingData。這樣做的好處是它只需要發生一次(每個客戶端訪問),但這當然也可以在服務器端(僅限於一次)完成,以使其更容易。或者,而不是一個數組,你可以將數組轉換爲一個Object,並使用組合的id屬性作爲鍵(這可能比創建一個可能含有大量空/未定義條目的數組更合理):

muchData = [ 
    { 
     ids: ["123", "234"], 
     interestingData: 1 
    }, 
    { 
     ids: ["123", "345"], 
     interestingData: 2 
    }, 
    ... 
], 
objOfData = {}, 
muchData.forEach(function (obj, index, array) { 
    objOfData[ obj.id.join('') ] = obj; 
}); 
相關問題