V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ZeroShiro
V2EX  ›  问与答

大佬们,问过 JS 的小问题

  •  
  •   ZeroShiro · 2020-07-24 09:34:46 +08:00 · 2137 次点击
    这是一个创建于 1612 天前的主题,其中的信息可能已经有所发展或是发生改变。
    let a = [1, 2, 3, 4];
    let b = [
      {
        obj: {
          id: 1,
          lock: false,
        },
      },
      {
        obj: {
          id: 2,
          lock: false,
        },
      },
    ];
    

    b 的 id 在 a 中出现了就改为 true
    解的方法就套娃 有没有更好的解法

    19 条回复    2020-07-24 21:43:40 +08:00
    yigemeirenyongde
        1
    yigemeirenyongde  
       2020-07-24 09:42:10 +08:00
    Number(true) Number(item.id) ?
    otakustay
        2
    otakustay  
       2020-07-24 09:42:16 +08:00
    b.filter(o => a.includes(o.obj.id)).forEach(o => o.obj.lock = true)
    这样子?
    ZeroShiro
        3
    ZeroShiro  
    OP
       2020-07-24 09:45:41 +08:00
    是 lock 改为 true
    TomatoYuyuko
        4
    TomatoYuyuko  
       2020-07-24 09:48:46 +08:00
    数据不复杂而且特征明显的话,直接转字符串正则或者转数组切分取出 id,includes 一遍就出来了
    不过还是套娃可读性高
    BreadKiller
        5
    BreadKiller  
       2020-07-24 09:50:58 +08:00   ❤️ 1
    b.forEach(o=>a.includes(o.obj.id)&&(o.obj.lock = true))
    easonHHH
        6
    easonHHH  
       2020-07-24 09:53:02 +08:00
    for(let {obj} of b.values()){
    obj.lock=a.includes(obj.id)
    }
    ZeroShiro
        7
    ZeroShiro  
    OP
       2020-07-24 09:56:47 +08:00
    @BreadKiller 这样 ok 感谢大佬
    heasy
        8
    heasy  
       2020-07-24 10:01:57 +08:00   ❤️ 4
    b.map(item => item.obj.lock = a.includes(item.obj.id))
    ZeroShiro
        9
    ZeroShiro  
    OP
       2020-07-24 10:02:35 +08:00
    let a = [1, 2, 3, 4];
    let b = [
    {
    obj: {
    children: [
    {
    id: 1,
    lock: true,
    },
    {
    id: 2,
    lock: true,
    },
    ],
    },
    },
    ];
    。。。
    ZeroShiro
        10
    ZeroShiro  
    OP
       2020-07-24 10:05:27 +08:00
    😂 升级了
    Vegetable
        11
    Vegetable  
       2020-07-24 10:29:26 +08:00
    写个递归,a 改成 Set,应该就没什么可做的了。
    hitaoguo
        12
    hitaoguo  
       2020-07-24 10:34:17 +08:00
    b.forEach(({obj})=> obj.lock = a.includes(obj.id))
    sima675
        13
    sima675  
       2020-07-24 10:42:39 +08:00
    b 改成对象就好了嘛
    Torpedo
        14
    Torpedo  
       2020-07-24 10:49:00 +08:00
    @otakustay 之前刷 leetcode 的时候,不能直视这么函数式的代码了
    zzuieliyaoli
        15
    zzuieliyaoli  
       2020-07-24 11:07:54 +08:00
    @heasy 这个好,没副作用
    MMZZ
        16
    MMZZ  
       2020-07-24 15:49:52 +08:00
    b.map(item => {
    return {
    obj: {
    id: item.obj.id,
    lock: a.includes(item.obj.id) ? true : false
    }
    }
    })
    前面都不太行吧?
    heasy
        17
    heasy  
       2020-07-24 19:46:09 +08:00
    @MMZZ includes 方法用来判断一个数组是否包含一个指定的值,如果包含则返回 true,否则返回 false 。
    auroraccc
        18
    auroraccc  
       2020-07-24 19:48:58 +08:00
    b.map(ele => ({obj: {...ele.obj, lock: a.includes(ele.obj.id)}}))
    otakustay
        19
    otakustay  
       2020-07-24 21:43:40 +08:00
    @MMZZ 是不是要 mutate 原来的对象这就是一个纯需求的事了,要的就 forEach,不要的就 map
    要用 map 的话,b.map(({obj}) => ({obj: {...obj, lock: a.includes(obj.id)}}))多漂亮(个屁)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1016 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 18:27 · PVG 02:27 · LAX 10:27 · JFK 13:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.