当前位置: 首页 > 知识库问答 >
问题:

javascript - 有点不是很理解,为什么这两个数组处理结果是这样的?

商佑运
2023-06-12
let arr1 = [
    {
        is_gift: 1,
        wg_id: 111,
    },
    {
        is_gift: 1,
        wg_id: 222,
    },
    {
        is_gift: 1,
        wg_id: 333,
    },
];

let arr2 = [
    {
        is_gift: 1,
        wg_id: 111,
    },
    {
        is_gift: 3,
        wg_id: 222,
    },
    {
        is_gift: 5,
        wg_id: 444,
    },
    {
        is_gift: 4,
        wg_id: 333,
    },
    {
        is_gift: 2,
        wg_id: 555,
    },
];

let a = [];
let b = [];

arr2.forEach((element1) => {
    arr1.forEach((element2) => {
        if (element2.wg_id != element1.wg_id) {
            a.push(element2);
        }

        if (element2.wg_id == element1.wg_id) {
            b.push(element2);
        }
    });
});

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

为什么 if((element2.wg_id != element1.wg_id)) 我打印的是全部数据,不会打印出不相等的数据。if((element2.wg_id == element1.wg_id)) 却可以找出相等的数据?

共有2个答案

郁景龙
2023-06-12

从你的描述来看,似乎你的目的是想取两个数组的交集与差集,交集你的数组b已经实现,关于差集的获取参考下面这个问题吧

https://segmentfault.com/q/1010000019019878

你的代码和你预期的结果不符合,
估计是你把两层forEach嵌套理解成先对arr2的所有所有元素都遍历一遍,
再对arr2所有元素的集合再进行第二次forEach中的比较
而实际上对外层的arr2.forEach,只会针对arr2中的每一个独立元素进行第二次forEach中的比较

例如arr2.forEach的第一次循环,element1{ is_gift: 1, wg_id: 111, },
然后再将arr1中的所有元素将其比较,wg_id不同的push进a,相同的push进b
之后反复进行第二、三、四、五次循环
第三、四次循环中,由于arr1中没有wg_idelement1(wg_id分别是444与555),所以在这两次循环中没有元素被push进b数组,因此最终b得到的结果就是ab数组的交集。
但是每次循环中都有2个元素(第三、四次循环是3个)与element1wg_id不同,他们都会被push进a中,导致了结果中会出现重复的元素。

高鸿振
2023-06-12

因为你是遍历整个arr1,只要arr1里有和arr2当前遍历到的元素不一样的 就把它加入a
举个例子:
arr2当前是111,遍历arr1: 111(相同)->222(不同) 加入a
arr2当前是222,遍历arr1: 111(不同) 加入a
arr2当前是444,遍历arr1: 111(不同) 加入a
...
发现所有arr2里的所有元素的wg_id都满足以上情况,自然a里面就是全部元素了

 类似资料:
  • const dataItem = (msg.data && msg.data[0]) || msg; 如果msg.data和msg.data[0]都为真时返回msg.data[0],否则返回msg?

  • 处理成 [11,1201,1304,1305]

  • 和有什么区别? 我对。class文件进行了反编译,发现在第一种情况下,JVM将使用multianwearray来创建数组,而在第二种情况下,它将使用AneWarRay。 我认为在第一种情况下,JVM将创建一个连续的空间。我说的对吗?

  • 本文向大家介绍了解事件代理吗,这样做有什么好处?相关面试题,主要包含被问及了解事件代理吗,这样做有什么好处?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 事件代理/事件委托:利用了事件冒泡,只指定一个事件处理程序,就可以管理某一类型的事件, 简而言之:事件代理就是说我们将事件添加到本来要添加的事件的父节点,将事件委托给父节点来触发处理函数,这通常会使用在大量的同级元素需要添加同一类事件的

  • 问题内容: 我正在尝试让Javascript读取/写入PostgreSQL数据库。我在github上找到了这个项目。我能够获得以下示例代码以在节点中运行。 接下来,我试图使其在网页上运行,但是似乎什么也没有发生。我在Javascript控制台上进行了检查,它只显示“要求未定义”。 那么这是什么“要求”?为什么它在节点中有效但在网页中无效? 另外,在我让它在节点上工作之前,我必须做。那是什么意思 我

  • 因此,作为学校的一部分,我正在使用For循环,我有一些代码可以工作,但我很难理解为什么它可以工作。对我来说,重要的是要真正理解为什么一块代码能做它不能做的事情,而不仅仅是它能工作。 所以有一点背景。这个小程序利用for循环,根据用户输入打印一系列字符。其思想是用户输入一个介于1和8之间的数字,程序将打印一个字符,然后移动到下一行再打印两个,移动到下一行再打印三个等等,并打印用户输入的行数。 程序在