比较两个 JavaScript 个对象数组并删除公共数组对象

Comparing two JavaScript Arrays of Objects and removing common Array Objects

var a = [
  [
    {
      id: "AAA"
    },
    {
      id: "BBB"
    }
  ],
  [
    {
      id: "AAA"
    },
    {
      id: "DDD"
    }
  ]
];
var b = [
  [
    {
      id: "BBB"
    }
  ],
  [
    {
      id: "CCC"
    },
    {
      id: "BBB"
    }
  ],
  [
    {
      id: "AAA"
    }
  ],
  [
    {
      id: "AAA"
    },
    {
      id: "DDD"
    }
  ],
  [
    {
      id: "DDD"
    }
  ],
  [
    {
      id: "CCC"
    },
    {
      id: "DDD"
    }
  ],
  [
    {
      id: "AAA"
    }
  ],
  [
    {
      id: "AAA"
    },
    {
      id: "BBB"
    }
  ]
];

function remove_duplicates(a, b) {
    for (var i = 0, len = a.length; i < len; i++) {
        for (var j = 0, len = b.length; j < len; j++) {
            if (a[i].name == b[j].name) {
                b.splice(j, 1);
            }
        }
    }

    console.log(a);
    console.log(b);

}

console.log(a);
console.log(b);

remove_duplicates(a,b);

我已经尝试过过滤和缩减,但它们得到了我想要的结果 我找到了一个 similar one 但我的那个结构略有不同

从JavaScript或下划线

寻求可能的解决方案

预期结果:[[{"id":"BBB"}],[{"id":"CCC"},{"id":"BBB"}],[{"id":"AAA"}],[‌​{"id":"DDD"}],[{"id"‌​:"CCC"},{"id":"DDD"}‌​]]

首先我们需要知道两个数组何时相等。我在 isEqual 函数中定义了这个,这样一个数组就等于另一个数组,如果它们的长度相同并且对象具有相同的 id 且顺序相同。

接下来,我们需要了解'remove duplicates'是什么意思。想象一下,如果您有两个数字数组。 [1,2,3,4] 和 [2,4,5,6]。我们期望结果为 [1,3,5,6]。我们通过获取第一个数组并减去第二个数组中存在的任何项目,然后获取第二个数组并减去第一个数组中存在的任何项目来做到这一点。最后我们将两个结果结合在一起。这就是 remove_duplicates 函数中发生的事情。

var a = [
  [
    {
      id: "AAA"
    },
    {
      id: "BBB"
    }
  ],
  [
    {
      id: "AAA"
    },
    {
      id: "DDD"
    }
  ]
];
var b = [
  [
    {
      id: "BBB"
    }
  ],
  [
    {
      id: "CCC"
    },
    {
      id: "BBB"
    }
  ],
  [
    {
      id: "AAA"
    }
  ],
  [
    {
      id: "AAA"
    },
    {
      id: "DDD"
    }
  ],
  [
    {
      id: "DDD"
    }
  ],
  [
    {
      id: "CCC"
    },
    {
      id: "DDD"
    }
  ],
  [
    {
      id: "AAA"
    }
  ],
  [
    {
      id: "AAA"
    },
    {
      id: "BBB"
    }
  ]
];

function remove_duplicates(a, b) {
  var setOfB = setOf(b);
  var setOfA = setOf(a);

  var aMinusB = minus(setOfA, setOfB);
  var bMinusA = minus(setOfB, setOfA);
  return aMinusB.concat(bMinusA);
}

function setOf(array){
  return _.uniq(array, false, JSON.stringify);
}

function minus(a,b) {
  return _.reject(b, function(item){
    return _.find(a, _.partial(_.isEqual, item));
  });
}


// var expected = [
//   [{"id":"BBB"}],
//   [{"id":"CCC"},{"id":"BBB"}],
//   [{"id":"AAA"}],
//   [{"id":"DDD"}],
//   [{"id":"CCC"},{"id":"DDD"}]
// ];


console.log(remove_duplicates(a,b));