1

给定两个对象数组,我如何找到所有包含“重叠”值的对象(例如本例中的价格)?

例如,给定数组 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 是包含整数而不是对象的简单数组,则交集可以找到精确匹配项(例如 30 和 30、20 和 20),但它仍然不包括我也需要的 20.45。而且,当然,我有一个对象数组而不是简单的数组,这也让它变得有点困难。

4

2 回答 2

0

似乎我们可以假设这些数组是按价格排序的(如果不是,请这样做 - 请参阅对 JavaScript 对象数组进行排序等),并且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);

i如果您需要在一个非常大的集合上获得更好的性能,您也可以使用二进制搜索来搜索边界j

于 2013-04-14T21:53:25.723 回答
-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]);
        }
于 2013-04-14T19:41:15.243 回答