JS 判断数组B是否存在A数组问题?

数组A 原始数组

[
    {
        "id": "4c80da7e5fac4c43adcb7e79dc6feeeb",
        "isSelect": 0,
        "rowLocked": 0,
        "sortNo": 1
    },
    {
        "id": "9a765b3ba453428ca7c9dff20974a173",
        "isSelect": 0,
        "rowLocked": 0,
        "sortNo": 2
    },
    {
        "id": "a6aa8ba1e5ba489598e708afdde0531b",
        "isSelect": 0,
        "rowLocked": 0,
        "sortNo": 3
    },
    {
        "id": "8045d81e9e8e40c5ae76a9d199ad211f",
        "isSelect": 0,
        "rowLocked": 0,
        "sortNo": 4,
        "validity": 1658419200000
    },
    {
        "id": "1813c65bd6cf4b489f8baf0b37d31427",
        "isSelect": 1,
        "rowLocked": 0,
        "sortNo": 5
    },
    {
        "id": "7895f65431fb405cbb463de58034043c",
        "isSelect": 0,
        "rowLocked": 0,
        "sortNo": 6
    }
]

数组B 会改变 前端每执行一次change方法,数组B的长度会变,会变成0 最大就等于原始数组A

[
    {
        "id": "4c80da7e5fac4c43adcb7e79dc6feeeb",
        "isSelect": 0,
        "rowLocked": 0,
        "sortNo": 1
    },

]

现在需要在change事件里面判断,数组B在数组A里面的话,把数组A里面对应的存在数组B的元素的isSelect变成1 否则变成0 这种数组比较应该怎么处理

阅读 2.9k
5 个回答

1.A先做一个id数组 const aids= = ['4c8...','9a7','a6a'...]
再做一个hash表(可以是map) key就是id value就是A数组里面id为key的那项
{

4c80da7e5fac4c43adcb7e79dc6feeeb:id为它的那项

}
2.change方法触发的时候 数组B的长度会变 遍历B拿到id数组 const bids = Barr.map(i=>i.id)
3.遍历A 如果id在bids里面则select=1否则select=0

aids.forEach(i=>{
    bids.includes(i)?hash表[i].select=1:hash表[i].select=0
})

时间复杂度应该是o(N) 也可以不做哈希表,hash表[i].select=1这种代码改成遍历A找到id符合的那项把它的select改变

伪代码,参考下

A.map(itemA => {
    return {
        ...itemA,
        isSelect: B.some(itemB => itemB.id === itemA.id) ? 1: 0
    }
})

遍历 A 数组,对每个元素检查是否存在于 B 数组中。考虑到可能之前有对 isSelect 赋值,所以不管有没有都两次对 isSelect 赋值,在就 1 不在就 0。

判断在不在可以用 .find() 方法查找,参数是一个查询条件,按题意应该是拿 id 来做对比吧。

function setMarkBy(origin, reference) {
    const idSet = new Set(reference.map(({ id }) => id));
    origin.forEach(it => {
        it.isSelect = idSet.has(it.id) | 0;
    });
    return origin;
}

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

如果 b 的数据量大就用 idSet,如果数据量小,直接用 find 性能也差不了多少,甚至可能更快(不需要建集合)

function setMarkBy(origin, reference) {
    origin.forEach(it => {
        it.isSelect = reference.find(({ id }) => it.id === id) ? 1 : 0;
    });
    return origin;
}
新手上路,请多包涵

试试看¿

const A = [];
const B = [];
const change = () => {
  const C = B.map(i => i.id);
  A.forEach(i => C.include(i.id) ? ({...i, isSelected : 1}) : ({...i, isSelected : 0}))
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题