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

通过 id 整理数据: Array+json 记录小案例 [找人问了怎么格式化]

  •  
  •   Aitmo · 2019-12-31 17:54:41 +08:00 · 675 次点击
    这是一个创建于 1579 天前的主题,其中的信息可能已经有所发展或是发生改变。
    《菜鸟小前端》
    
    举个栗子: /* 原始数据:/ var arr = [{"id": 1,"user": {"name": "张三"}},{"id": 1,"user": {"name": "李四"}}]; / 转换后 :*/ var arr1 = [{"id": 1,"data": [{"name": "张三"}, {"name": "李四"}]}]
    
    // 处理数组中的 json 数据,根据相同 id 将一层 json 数据中的二层 json 集合到一起
    function uniqueArray(arr, type) { //形参 1 数组  形参 2 判断的数据类型
      var map = {}, //承载判断的集合容器
        dest = [], //自定义的数组
        keys = []; //动态的 key 值
      for (var i = 0; i < arr.length; i++) {
        var ai = arr[i];
        if (!map[ai.id]) { //循环的条件
          /*动态获取 json 的 key 值*/
          for (var key in ai) {
            keys.push(key)
          }
          keys = [...new Set(keys)]; //将 keys 数组去重 [因为循环了很多次] 
          let obj = {}; //obj===ai 添加上承载字段
          keys.map((item, id) => { //动态 key 值操作 [同步] 
            if (typeof ai[keys[id]] == type) { //判断数据类型是不是自己要的,例如 object
              obj.data = [ai[keys[id]]] //判断出的数据放置在 obj 添加的承载字段
            } else {
              obj[keys[id]] = ai[keys[id]]; //将原 ai 的值赋值给重新定义的 obj
            }
          })
          dest.push(obj); //将 ai 处理为 obj 放置自定义的数组中
          /*
          已知 json 的 key 值 [被替代] 
          {
              id: ai.id,
              createdAt: ai.createdAt,
              is_root: ai.is_root,
              name: ai.name,
              user: [ai.user]
          }*/
          map[ai.id] = ai; //通过要处理数据的 id 赋值 map 多重集合
        } else {
          // 如果遇到相同的 id
          for (var j = 0; j < dest.length; j++) { //通过遍历自定义的新数组
            var dj = dest[j];
            if (dj.id == ai.id) { //找到与相同 id 的字段数据
              keys.map((item, id) => { //动态 key 值操作 [同步] 
                if (typeof ai[keys[id]] == type) { //判断数据类型是不是自己要的,例如 object
                  dj.data.push(ai[keys[id]]); //将判断的数据继续放置相同 id 的字段中的自定义的数组中
                }
              })
              /* 已知要放置的数据 dj.data.push(ai.user); [被替代] */
              break;
            }
          }
        }
      }
      return dest;
    }
    
    
    
    
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5833 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 06:14 · PVG 14:14 · LAX 23:14 · JFK 02:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.