如何将两个集合转换为一个集合

How to transform two collections into one

本文关键字:集合 一个 转换 两个      更新时间:2023-09-26

这是一个基本的数据结构问题,也是一个具体的实现问题。

我有两个集合:

['One', 'Two', 'Three']
[{'Name': 'Two', 'Time': '12:00'}, {'Name': 'Four', 'Time': '14:30'}]

我想要的是将它们合并到第三个集合中:

[
    {'Name': 'One', 'HasTime': false, 'Valid': true },
    {'Name': 'Two', 'HasTime': true, 'Valid': true, 'Time': '12:00' },
    {'Name': 'Three', 'HasTime': false, 'Valid': true },
    {'Name': 'Four', 'HasTime': true, 'Valid': false, 'Time': '14:30' },
]

我可以像在这个伪代码中一样做到这一点:

// Pseudo-Code, hence no isOwnProperty and other checks
var r = [];
for(v in one) {
  var obj = { Name: v, Valid: true, HasTime: false };
  for(t in two) {
    if(t.Name === v) {
        obj.HasTime = true;
        obj.Time = t.Time;
        break;
    }
  }
  r.push(obj);
}
for(t in two) {
    var valid = false;
    for(x in r) {
        if(x.Name === t.Name) {
           valid = true;
           break;
        }
    }
    if(!valid) {
      var obj = new { Name: t.name, Valid: false, HasTime: true, Time: t.Time };
      r.push(obj);
    }
}
return obj;

这似乎效率低下,我想知道 Angular 是否已经有这样的功能 - 我的问题是我不知道这种技术叫什么。我想在集合论或函数式编程中有一个术语,因为这本质上是一个联合,然后是一个变换,但是函数式编程中的基本术语我无法理解 - 有这个名字吗?

如果你愿意,你可以称之为map-reduce,因为你基本上需要首先将两个数组转换为统一的结构(Map),然后将它们合并在一起(Reduce)。

然而,它没有什么神奇之处,特别是因为你的结构是完全定制的,所以你不能避免你的 aglorithm。

你真的不需要map缩减,因为你只有两个数组,但为了给你一个想法,它看起来像这样:

var result = [one, two].map(function(arr) {
  // transform arr into {Name, Valid, HasTime} items
}).reduce(function(arr1, arr2) {
  // merge arr1 and arr2
});