【问题标题】:use underscore or lodash convert one JSON structure to another使用下划线或 lodash 将一种 JSON 结构转换为另一种
【发布时间】:2018-07-27 09:39:57
【问题描述】:

我在尝试将当前 JSON 结构转换为另一个时遇到问题

var data = [
  {
    "url": "asset/01.flv",
    "pic": "asset/01.jpg"
  },
  {
    "url": "asset/02.flv",
    "pic": "asset/02.jpg"
  },
  {
    "url": "asset/03.flv",
    "pic": "asset/03.jpg"
  },
  {
    "url": "asset/04.flv|asset/05.flv|asset/06.flv|asset/07.flv|asset/08.flv",
    "pic": "asset/04.jpg|asset/05.jpg|asset/06.jpg|asset/07.jpg|asset/08.jpg"
  },
  {
    "url": "asset/09.flv|asset/10.flv",
    "pic": "asset/09.jpg|asset/10.jpg"
  }
]

我想将数据转换成这样的输出结构。
这是我想要达到的结果的目标。

var data = [
  {
    "url": "asset/01.flv",
    "pic": "asset/01.jpg"
  },
  {
    "url": "asset/02.flv",
    "pic": "asset/02.jpg"
  },
  {
    "url": "asset/03.flv",
    "pic": "asset/03.jpg"
  },
  {
    "url": "asset/04.flv",
    "pic": "asset/04.jpg"
  },
  {
    "url": "asset/05.flv",
    "pic": "asset/05.jpg"
  },
  {
    "url": "asset/06.flv",
    "pic": "asset/06.jpg"
  },
  {
    "url": "asset/07.flv",
    "pic": "asset/07.jpg"
  },
  {
    "url": "asset/08.flv",
    "pic": "asset/08.jpg"
  },
  {
    "url": "asset/09.flv",
    "pic": "asset/09.jpg"
  },
  {
    "url": "asset/10.flv",
    "pic": "asset/10.jpg"
  }
]

这对我来说很难,有人可以在这件事上帮助我吗?我已经尝试了几个小时。使用 lodash 或下划线或纯 JS 是可以的。提前致谢。

【问题讨论】:

    标签: javascript underscore.js lodash


    【解决方案1】:

    您可以使用Array#reduce 来完成此操作。想法是遍历数组并检查 urlpic 的值是否包含 |

    如果是这样,拆分值并将所有项目推送到结果。如果没有,请按原样推送urlpic

    var data = [{"url":"asset/01.flv","pic":"asset/01.jpg"},{"url":"asset/02.flv","pic":"asset/02.jpg"},{"url":"asset/03.flv","pic":"asset/03.jpg"},{"url":"asset/04.flv|asset/05.flv|asset/06.flv|asset/07.flv|asset/08.flv","pic":"asset/04.jpg|asset/05.jpg|asset/06.jpg|asset/07.jpg|asset/08.jpg"},{"url":"asset/09.flv|asset/10.flv","pic":"asset/09.jpg|asset/10.jpg"}];
    
    var result = data.reduce((r, {url, pic}) => {
      if (url.includes('|') && pic.includes('|')) {
        var urls = url.split('|');
        var pics = pic.split('|');
        
        urls.forEach((u, i) => {
          r.push({url: u, pic: pics[i]});
        });
      } else {
        r.push({url, pic})
      }
      
      return r;
    }, []);
    
    console.log(result);

    【讨论】:

      【解决方案2】:

      您可以使用Array.reduce 自己进行操作。

      const arr = [{
          "url": "asset/01.flv",
          "pic": "asset/01.jpg"
        },
        {
          "url": "asset/02.flv",
          "pic": "asset/02.jpg"
        },
        {
          "url": "asset/03.flv",
          "pic": "asset/03.jpg"
        },
        {
          "url": "asset/04.flv|asset/05.flv|asset/06.flv|asset/07.flv|asset/08.flv",
          "pic": "asset/04.jpg|asset/05.jpg|asset/06.jpg|asset/07.jpg|asset/08.jpg"
        },
        {
          "url": "asset/09.flv|asset/10.flv",
          "pic": "asset/09.jpg|asset/10.jpg"
        }
      ];
      
      console.log(arr.reduce((tmp, {
        pic,
        url,
      }) => {
        const urlSplit = url.split('|');
      
        return [
          ...tmp,
      
          ...pic.split('|').map((x, xi) => ({
            pic: x,
            url: urlSplit[xi],
          })),
        ];
      }, []));

      【讨论】:

        【解决方案3】:

        恕我直言,您可以使用 Array#reduce() 执行类似操作:

        var data = [{"url":"asset/01.flv","pic":"asset/01.jpg"},{"url":"asset/02.flv","pic":"asset/02.jpg"},{"url":"asset/03.flv","pic":"asset/03.jpg"},{"url":"asset/04.flv|asset/05.flv|asset/06.flv|asset/07.flv|asset/08.flv","pic":"asset/04.jpg|asset/05.jpg|asset/06.jpg|asset/07.jpg|asset/08.jpg"},{"url":"asset/09.flv|asset/10.flv","pic":"asset/09.jpg|asset/10.jpg"}];
        
        var parsedData = data.reduce((accumulator, e) => {
          e['url'].split('|').forEach((ele, i) => {
            accumulator.push({"url":ele, "pic": e['pic'].split('|')[i]})
          })
          return accumulator;
        }, [])
        
        console.log(parsedData);

        使用Underscore.js_.zip() 函数的相同解决方案。

        var data = [{"url":"asset/01.flv","pic":"asset/01.jpg"},{"url":"asset/02.flv","pic":"asset/02.jpg"},{"url":"asset/03.flv","pic":"asset/03.jpg"},{"url":"asset/04.flv|asset/05.flv|asset/06.flv|asset/07.flv|asset/08.flv","pic":"asset/04.jpg|asset/05.jpg|asset/06.jpg|asset/07.jpg|asset/08.jpg"},{"url":"asset/09.flv|asset/10.flv","pic":"asset/09.jpg|asset/10.jpg"}];
        
        var parsedData = data.reduce((accumulator, e) => {
          return accumulator.concat(...(_.zip(e['url'].split('|'), e['pic']
                     .split('|'))
                     .map(([url, pic]) => ({url, pic}))))
        }, []);
        
        console.log(parsedData)
        <script src="https://underscorejs.org/underscore-min.js"></script>

        【讨论】:

        • 检查flatMapreduce 应该是当没有其他更高级别的抽象工作时的最后手段。
        【解决方案4】:

        flatmapzipWith 一起使用怎么样??

        const sortedData = _.flatMap(data, obj =>
            _.zipWith(
                obj.url.split("|"),
                obj.pic.split("|"),
                (url, pic) => ({url, pic})
            )
        );
        

        var data = [
          {
            "url": "asset/01.flv",
            "pic": "asset/01.jpg"
          },
          {
            "url": "asset/02.flv",
            "pic": "asset/02.jpg"
          },
          {
            "url": "asset/03.flv",
            "pic": "asset/03.jpg"
          },
          {
            "url": "asset/04.flv|asset/05.flv|asset/06.flv|asset/07.flv|asset/08.flv",
            "pic": "asset/04.jpg|asset/05.jpg|asset/06.jpg|asset/07.jpg|asset/08.jpg"
          },
          {
            "url": "asset/09.flv|asset/10.flv",
            "pic": "asset/09.jpg|asset/10.jpg"
          }
        ]
        
        var res = _.flatMap(data, o=>_.zipWith(o.url.split("|"), o.pic.split("|"), (url, pic) => ({url, pic})));
        
        console.log(res);
        <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

        【讨论】:

        • 我认为这是最优雅的方法。也许您可以使用适当的代码块并修复缩进?因为单行很难掌握。
        • 嘿,谢谢@tokland,基本上我没有格式化,因为我只使用了两个函数 flatMapzipWith 并且只是执行了一个非常必要的拆分。在您提出建议后,我尝试了一个格式化程序,它只是用最后的返回语句 ({url, pic}) 将它分成另一行。如果您觉得该行的某些格式更适合更好地理解,您可以进行编辑,这对其他人会有所帮助:)
        • 完成!如果您不喜欢这么多换行符,请随意恢复它;)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-27
        • 1970-01-01
        • 1970-01-01
        • 2015-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多