数组元素为对象,对比多个数组的相同子元素并筛选

情景:两个数组,list1为多选选项列表,list2为用户已选择的选项,

                            第一个数组    list1 = [{name:'aa'}, {name:'bb'}, {name:'cc'}];

                            第二个数组     list2= ['aa', 'bb'];

目的:筛选已选选项保存,格式: [{"name":"aa","isSame":"Y"},{"name":"bb","isSame":"Y"},{"name":"cc","isSame":"N"}]

首先,思路:通过遍历两个数组,筛选重复元素push到same数组中;

 1 <script>
 2     let list1 = [{name:'aa'}, {name:'bb'}, {name:'cc'}];
 3     let list2 = ['aa', 'bb'];
 4     let same = [];
 5     for (let i = 0; i < list1.length; i++) {
 6         list1[i].isCheck = 'isFalse';
 7         for (let j = 0; j < list2.length; j++) {
 8             if (list1[i].name == list2[j]) {
 9                same.push({
10                    name:list1[i].name,
11                    isSame:'Y'
12                });
13             }else{
14                 same.push({
15                     name:list1[i].name,
16                     isSame:'N'
17                 });
18             }
19         }
20     }
21     console.log('same',same);
22 </script>
View Code

此时输出结果如下图: 

我们会发现same中被push了6个元素,但是正确结果应该是2个元素。

原因是双层for循环共执行了6次,每次都进行比对、push,所以push了6个元素。

但是,后来找到了解决办法:为筛选出的相同元素添加一个属性,避免重复向same数组push。

<script>
    let list1 = [{name:'aa'}, {name:'bb'}, {name:'cc'}];
    let list2 = ['aa', 'bb'];
    let same = [];
    for (let i = 0; i < list1.length; i++) {
        list1[i].isCheck = 'isFalse';
        for (let j = 0; j < list2.length; j++) {
            if (list1[i].name == list2[j]) {
                list1[i].isCheck = 'isTrue';
            }
        }
    }
    for (let i = 0; i < list1.length; i++) {
        same.push({
            name: list1[i].name,
            isSame: list1[i].isCheck == 'isTrue' ? 'Y' : 'N'
        })
    }
    console.log('same',JSON.stringify(same));
</script>

此时输出结果为:

same [{"name":"aa","isSame":"Y"},{"name":"bb","isSame":"Y"},{"name":"cc","isSame":"N"}]

所以,后一种方法是正确的。

转载于:https://www.cnblogs.com/lemoncool/p/8571743.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值