2013-04-14 96 views
1

給定兩個對象數組,我如何找到包含'重疊'值的所有對象(例如本例中的價格)?如何從JavaScript中的對象數組中找到'重疊'值?

例如,給定數組A和數組B,我如何找到所有「價格」是完全匹配(例如20,30)還是包含在此重疊內(例如20.45)的對象?

var A = [ 
    { "id" : 1, "price" : 50, "quantity": 2 }, 
    { "id" : 2, "price" : 40, "quantity": 2 }, 
    { "id" : 3, "price" : 30, "quantity": 2 }, // yes 
    { "id" : 4, "price" : 20, "quantity": 2 } // yes 
]; 

var B = [ 
    { "id" : 5, "price" : 30, "quantity": 2 }, // yes 
    { "id" : 6, "price" : 20.45, "quantity": 2 }, // yes 
    { "id" : 7, "price" : 20, "quantity": 2 }, // yes 
    { "id" : 8, "price" : 10, "quantity": 2 }, 
    { "id" : 9, "price" : 5, "quantity": 2 } 
]; 


// Goal 
var C = [ 
    { "id" : 3, "price" : 30, "quantity": 2 }, // yes 
    { "id" : 4, "price" : 20, "quantity": 2 } // yes 
]; 
var D = [ 
    { "id" : 5, "price" : 30, "quantity": 2 }, // yes 
    { "id" : 6, "price" : 20.45, "quantity": 2 }, // yes 
    { "id" : 7, "price" : 20, "quantity": 2 }, // yes 
]; 

我的目標是讓他們分離到自己的數組(C & d)。但如果最終結果需要是一個組合數組,那沒關係。我也可以做這個工作。任何有用的東西現在都會讓我開心。

我試過了下劃線的十字路口。如果A & B是包含整數而不是對象的簡單數組,則交集可以找到完全匹配(例如,但它仍然不包括20.45,我也需要這樣做)。當然,我有一組對象而不是簡單的數組,這也使得它更難一些。

+0

簡單的循環可以做到這一點... – monkeyinsight

回答

0

看來我們可以假設這些陣列按價格排列(如果沒有,這樣做 - 看Sorting an array of JavaScript objects和類似),而A包含價格比B更高(如果沒有,你需要反轉邏輯)。然後,只需做:

var i = A.length - 1, 
    j = 0, 
    overlapMin = A[i].price, 
    overlapMax = B[j].price; 
while (A[i].price <= overlapMax) i--; 
while (B[j].price >= overlapMin) j++; 
var C = A.slice(i+1), // to end 
    D = B.slice(0, j); 

如果你需要一個非常龐大的一套更好的性能,你可以使用二進制搜索邊界ij爲好。

+0

工作!看起來非常有效。我正在按價格排序。我試圖點擊投票,它不會讓我作爲一個SO noob,但它回來了-1。不知道這是我還是隻是更新理貨。對不起,如果我不小心做了upvote。 ;)WTH Stackoverflow? – inkedd

-1
var C = [], D = []; 
for (var i in A) 
    for (var j in B) 
     if (A[i].price > B[j].price-1 && A[i].price < B[j].price+1) { 
      C.push(A[i]); 
      D.push(B[j]); 
     } 
+0

嗯有些東西稍微偏離。 C&D最終會得到比A&B更多的對象。http://jsfiddle.net/R5vjN/ – inkedd

+0

是的,應該有&&不是|| – monkeyinsight

+0

[不要在陣列中使用'for-in'''循環!!!](http://stackoverflow.com/q/500504/1048572) – Bergi

相關問題