javascript - 获取阵列之间的综合差异 - 在这种情况下需要同步阵列

标签 javascript arrays nested-loops symmetry

我不确定我是否在标题中最好地描述了问题,但我会在这里详细说明。

我的总体目标是保持列表同步,我目前正在尝试获取特定输出,以便稍后可以纠正列表对称性。

到目前为止我已经弄清楚了:

代码:

let list2 = [
{user: 001, log: [1,2,3,4,5,6,7,8,9,10]},
{user: 002, log: [2,3,4,5,6,7,8,9, 44]},
{user: 003, log: [1,2,3,4,6,7,8]},
{user: 004, log: [1,2,3,4,5,6,7,8]}
];

for (let comparator = 0; comparator < list2.length; comparator++) {
    for (let index = 0; index < list2.length; index++) {
        if (comparator !== index) {
            let currentDiff = list2[comparator].log.filter(x => !list2[index].log.includes(x));
                    console.log("User: " + list2[index].user + " needs " + currentDiff + " from user: " + list2[comparator].user);
    }
  }
}

输出:

User: 2 needs 1,10 from user: 1
User: 3 needs 5,9,10 from user: 1
User: 4 needs 9,10 from user: 1
User: 1 needs 44 from user: 2
User: 3 needs 5,9,44 from user: 2
User: 4 needs 9,44 from user: 2
User: 1 needs  from user: 3
User: 2 needs 1 from user: 3
User: 4 needs  from user: 3
User: 1 needs  from user: 4
User: 2 needs 1 from user: 4
User: 3 needs 5 from user: 4

这输出了太多的数据&我想压缩它

期望的输出是所有数据都被压缩,这样“需要”就不会重复,因此,例如,如果用户#2可以从用户#1获得1和10,那么就不需要输出用户#2需要1来自用户 #3...你关注我吗?我认为这可以变得简单,但我只是不知道有什么操作可以轻松完成此任务。

这是我想要实现的输出模型(理想情况下):

[
{"user": 1,
"symmetriseLogs": [
                   {user: 2, missingLogs: [1, 10]},
                   {user: 3, missingLogs: [5, 9, 10]},
                   {user: 4, missingLogs: [9, 10]},
                                                       ]},
{"user": 2,
"symmetriseLogs": [
                   {user: 1, missingLogs: [44]},
                   {user: 3, missingLogs: [44]},
                   {user: 4, missingLogs: [44]},
                                                       ]},
]

输出应该是对称所有日志所需的内容,因此在示例输出中,用户 #1 和 #2 缺少的所有内容都可以从对方获得,因此用户 #3 和 #4 不会获得输出。另外,用户 #2 仅需要输出 44,因为这是唯一的日志项 44,其他日志项缺失且无法从用户 #1 获取。

有点循环逻辑噩梦,我将不胜感激任何解决此问题的帮助。为了实现这一目标,我只得到了更多令人困惑的输出。

最佳答案

一种方法是,在开始迭代之前,您可以创建一个镜像结构,将每个用户映射到其迄今为止拥有的日志。在循环内,查找用户的现有日志以检查需要添加哪些数字。

它并不像 .map 所希望的那样纯粹,但它完成了工作,而且我想不出更好看的方法。

const list2 = [
{user: 001, log: [1,2,3,4,5,6,7,8,9,10]},
{user: 002, log: [2,3,4,5,6,7,8,9, 44]},
{user: 003, log: [1,2,3,4,6,7,8]},
{user: 004, log: [1,2,3,4,5,6,7,8]}
];

const haveLogsByUserId = new Map(list2.map(({ user, log }) => [user, new Set(log)]));

const result = list2.map((source, i) => ({
  user: source.user,
  symmetriseLogs: list2
    .filter((_, j) => i !== j)
    .map(dest => {
      const thisUserLogs = haveLogsByUserId.get(dest.user);
      const missingLogs = source.log.filter(num => !thisUserLogs.has(num));
      for (const num of missingLogs) thisUserLogs.add(num);
      return { user: dest.user, missingLogs };
    })
    .filter(missingObj => missingObj.missingLogs.length)
}));
console.log(result);

关于javascript - 获取阵列之间的综合差异 - 在这种情况下需要同步阵列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70319786/

相关文章:

loops - x86 程序集中嵌套在另一个循环中的两个循环

javascript - JQuery循环遍历多维数组

ios - 如何保存组装好的 NSArray?

Python 嵌套 for 循环行为

javascript - 将 Babel 外部助手与 ES6 模块一起使用时出现问题 - Babel 重新排序导入/导出会破坏执行顺序

javascript - 使用边界时,带有连字符的正则表达式似乎被破坏了?

javascript - 父div垂直屏幕旋转时子div无法访问

javascript - 如何使用带有 swfobject 的 JavaScript 检查是否加载了 swf?

Ruby:有条件地更改数组中的最后一个元素

c++ - 嵌套循环最有可能因为不正确的 bool 运算符而重复自身 C++