比较两个数组并合并去重

3
var a = [{id: 14679333, name: "Churchill Downs", eventStatusCode: "A", isActive: "true"},
         {id: 14679333, name: "Gulfstream", eventStatusCode: "A", isActive: "true"},
         {id: 14679333, name: "Remington Park", eventStatusCode: "A", isActive: "true"},
         {id: 14679333, name: "Santa Anita", eventStatusCode: "A", isActive: "true"}, 
         {id: 14679333, name: "Golden Gate Fields", eventStatusCode: "A", isActive: "true"}]


var b = [{id: 14679333, name: "Santa Anita", eventStatusCode: "A", isActive: "true"},
         {id: 14679333, name: "Charles Town", eventStatusCode: "A", isActive: "true"},
         {id: 14679333, name: "Golden Gate Fields", eventStatusCode: "A", isActive: "true"},
         {id: 14679333, name: "Remington Park", eventStatusCode: "A", isActive: "true"},
         {id: 14679333, name: "Los Alamitos", eventStatusCode: "A", isActive: "true"}]

代码:

 for(var i=0; i< b.length;i++){
   if((b[i].typeName || b[i].name) != (a[i].typeName || a[i].name)){
    var c= a.concat(b)
     console.log("after concat",c)
   }
 }

我试图比较两个数组,并将它们合并成一个数组,但我得到了以下输出:
c= [{id: 14679333, name: "Churchill Downs", eventStatusCode: "A", isActive: "true"},
{id: 14679333, name: "Gulfstream", eventStatusCode: "A", isActive: "true"},
{id: 14679333, name: "Remington Park", eventStatusCode: "A", isActive: "true"},
{id: 14679333, name: "Santa Anita", eventStatusCode: "A", isActive: "true"},
{id: 14679333, name: "Golden Gate Fields", eventStatusCode: "A", isActive: "true"},
{id: 14679333, name: "Santa Anita", eventStatusCode: "A", isActive: "true"},
{id: 14679333, name: "Charles Town", eventStatusCode: "A", isActive: "true"},
{id: 14679333, name: "Golden Gate Fields", eventStatusCode: "A", isActive: "true"},
{id: 14679333, name: "Remington Park", eventStatusCode: "A", isActive: "true"},
{id: 14679333, name: "Los Alamitos", eventStatusCode: "A", isActive: "true"}]

期望的输出结果:

c = [{id: 14679333, name: "Churchill Downs", eventStatusCode: "A", isActive: "true"},
     {id: 14679333, name: "Gulfstream", eventStatusCode: "A", isActive: "true"},
     {id: 14679333, name: "Remington Park", eventStatusCode: "A", isActive: "true"},
     {id: 14679333, name: "Santa Anita", eventStatusCode: "A", isActive: "true"},
     {id: 14679333, name: "Golden Gate Fields", eventStatusCode: "A", isActive: "true"},
     {id: 14679333, name: "Charles Town", eventStatusCode: "A", isActive: "true"},
     {id: 14679333, name: "Los Alamitos", eventStatusCode: "A", isActive: "true"}]

你好,欢迎来到SO!为什么不看一下“如何提出一个好问题”的指南呢?这里有太多的代码和解释了。请尝试调整你的格式。 - Francesco
4个回答

2
你可以使用 Set 来查找相同的名称并过滤所有项目的数组。

var a = [{ id: 14679333, name: "Churchill Downs", eventStatusCode: "A", isActive: "true" }, { id: 14679333, name: "Gulfstream", eventStatusCode: "A", isActive: "true" }, { id: 14679333, name: "Remington Park", eventStatusCode: "A", isActive: "true" }, { id: 14679333, name: "Santa Anita", eventStatusCode: "A", isActive: "true" }, { id: 14679333, name: "Golden Gate Fields", eventStatusCode: "A", isActive: "true" }],
    b = [{ id: 14679333, name: "Santa Anita", eventStatusCode: "A", isActive: "true" }, { id: 14679333, name: "Charles Town", eventStatusCode: "A", isActive: "true" }, { id: 14679333, name: "Golden Gate Fields", eventStatusCode: "A", isActive: "true" }, { id: 14679333, name: "Remington Park", eventStatusCode: "A", isActive: "true" }, { id: 14679333, name: "Los Alamitos", eventStatusCode: "A", isActive: "true" }],
    result = [...a, ...b]
        .filter(
            (s => ({ name }) => !s.has(name) && s.add(name))
            (new Set)
        );

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


0

if语句(b[i].typeName || b[i].name) != (a[i].typeName || a[i].name)是不正确的,即使我知道你在口语英语中的意思。

应该是(b[i].typeName == a[i].typeName) || (b[i].typeName == a[i].name) || (b[i].name == a[i].typeName) || (b[i].name == a[i].name)

for (var i = 0; i < b.length; i++) {
  if ((b[i].typeName == a[i].typeName) || (b[i].typeName == a[i].name) || (b[i].name == a[i].typeName) || (b[i].name == a[i].name)) {
    var c = a.concat(b)
    console.log("after concat", c)
  }
}

目前,(b[i].typeName || b[i].name)本身会返回false(a[i].typeName || a[i].name)也是如此。因此完整语句始终返回false

我猜想你想要做的是询问"这个或者那个"是否等于"这个或者那个"。为了实现这一点,你需要逐个查看四种组合情况,这就是我的代码所做的事情。


0

以上的回答都很好。你可以用一行代码实现这个功能,试试这段代码:

var a = [{id: 14679333, name: "Churchill Downs", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Gulfstream", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Remington Park", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Santa Anita", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Golden Gate Fields", eventStatusCode: "A", isActive: "true"}]
var b = [{id: 14679333, name: "Santa Anita", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Charles Town", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Golden Gate Fields", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Remington Park", eventStatusCode: "A", isActive: "true"}, {id: 14679333, name: "Los Alamitos", eventStatusCode: "A", isActive: "true"}];

var combined = [...a, ...b];
var filtered = [...new Map(combined.map(val=>[val.name, val])).values()];
console.log(filtered);


0
将您的数组合并到一个新数组中,然后消除重复项:
合并:
let newArr = [...a, ...b];

以下过滤器代码将无法正常工作,如果内部对象的引用不相同:
newArr = newArr.filter((item, pos) => {
    return a.indexOf(item) == pos;
});

解决方案:
如果您想让名称属性唯一,请使用以下代码进行过滤。
let newArr = [...a, ...b];
const temp = {};
for (let i = 0; i < newArr.length; i++) {
  temp[newArr[i].name]= newArr[i];
}
newArr = [];
for (let key in temp) {
  newArr.push(temp[key]);
}
console.info(newArr);
console.info(newArr.map( o => o.name).sort());

--> 7 个项目


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接