*初级小白*~ 2023-03-21 17:06 采纳率: 97.9%
浏览 38
已结题

JavaScript数组变化

如何把obj3替换掉arr数组里面的info消息,得出res

img

const arr = [{
      content: {
        info: {
          stu1: {
            name: '张三',
            age: 12,
            school:'南校'
          },
          stu2:{
            name:'李四',
            age:12,
            school:'北校'
          }
        }
      }
    }, {
      content: {
        info: {
          stu1: {
            name: '张三',
            age: 12,
            school:'南校'
          },
          stu2:{
            name:'李四',
            age:12,
            school:'北校'
          }
        }
      }
    }]
    const obj3={
      info: {
          stu1: {
            name: '张三',
            age: 12
          },
          stu2:{
            name:'李四',
            age:12
          },
          stu3:{
            name:'王五',
            age:23
          }
        }
    }

  • 写回答

2条回答 默认 最新

  • CSDN专家-showbo 2023-03-21 17:09
    关注

    根据name值决定是否删除、添加arr中对应项?还是根据stu1,stu2,stu3这种键名称?

    下面这个是根据stu1,stu2,stu3这种键名称

    ///arr和obj3数据
        let keys = Object.keys(obj3.info);
        arr.forEach(item => {
            //新增
            keys.forEach(key => {
                if (!item.content.info[key]) {
                    item.content.info[key] = obj3.info[key];
                }
            });
            //删除
            Object.keys(item.content.info).forEach(key => {
                if (!obj3.info[key]) delete item.content.info[key]
            })
        });
        console.log(JSON.stringify(arr, null, 2))
    

    下面根据name

        ///得到同一个info下的不重名键名称
        function getKey(info) {
            let i = 1;
            while (true) {
                if (!info['stu' + i]) return 'stu' + i
                i++;
            }
        }
    
        let key_names = Object.keys(obj3.info).map(i => ({ key: i, name: obj3.info[i].name }));//得到obj3中的name值和键值对象集合
        arr.forEach(item => {
            let keys = Object.keys(item.content.info), arrNames = keys.map(i => item.content.info[i].name)
    
            //删除
            keys.forEach(key => {
                if (!key_names.some(i => item.content.info[key].name == i.name)) delete item.content.info[key]
            });
    
            //添加
            key_names.forEach(i => {
                if (!arrNames.some(x => i.name == x)) item.content.info[getKey(item.content.info)] = obj3.info[i.key];
            })
        });
        console.log(JSON.stringify(arr, null, 2))
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月4日
  • 已采纳回答 3月27日
  • 修改了问题 3月21日
  • 创建了问题 3月21日

悬赏问题

  • ¥15 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 求螺旋焊缝的图像处理
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?
  • ¥15 网络通信安全解决方案
  • ¥50 yalmip+Gurobi
  • ¥20 win10修改放大文本以及缩放与布局后蓝屏无法正常进入桌面
  • ¥15 itunes恢复数据最后一步发生错误
  • ¥15 关于#windows#的问题:2024年5月15日的win11更新后资源管理器没有地址栏了顶部的地址栏和文件搜索都消失了