首页 > 解决方案 > Javascript基于递增键合并对象数组

问题描述

这就是我所拥有的:我想合并以 "path-"+i 开头的键的对象。并在最终结果中从键中删除“path-i”。

  var arr = [
  {
    "key": "path-0-mp4",
    "value": [
      "media/video/01.mp4",
      "media/video/01_hd.mp4"
    ]
  },
  {
    "key": "path-0-quality",
    "value": [
      "720p",
      "1080p"
    ]
  },
  {
    "key": "path-1-mp4",
    "value": [
      "media/video/02.mp4",
      "media/video/02_hd.mp4"
    ]
  },
  {
    "key": "path-1-quality",
    "value": [
      "SD",
      "HD"
    ]
  }

]

这是期望的结果:

 var arr = [
        [
              {
                "mp4": "media/video/01.mp4",
                "quality": "720p"
              },
              {
                "mp4": "media/video/01_hd.mp4",
                "quality": "1080p"
              },
        ],
        [
              {
                "mp4": "media/video/02.mp4",
                "quality": "SD"
              },
              {
                "mp4": "media/video/02_hd.mp4",
                "quality": "HD"
              },
        ],
]

我开始做某事,但还没有接近:

var key, new_key, value,j=0, z=0, parr = [], obj;
for(var i = 0;i<a.length;i++){
    console.log('item:' ,a[i])
    key = a[i].key, value = a[i].value
    if(key.indexOf('path-'+j.toString()) > -1){
        new_key = key.substr(key.lastIndexOf('-')+1)
        console.log(key, new_key, value)
        for(var z = 0;z<value.length;z++){
            parr.push({[new_key]: value[z] })
        }
    }
}

console.log(parr)

[
  {
    "mp4": "media/video/01.mp4"
  },
  {
    "mp4": "media/video/01_hd.mp4"
  },
  {
    "quality": "720p"
  },
  {
    "quality": "1080p"
  }
]

编辑:

Array 可以保留需要以相同方式分组的不同键,例如:

    var arr = [
  {
    "key": "path-0-mp4",
    "value": [
      "media/video/01.mp4",
      "media/video/01_hd.mp4"
    ]
  },
  {
    "key": "path-0-quality",
    "value": [
      "720p",
      "1080p"
    ]
  },
  {
    "key": "path-1-mp4",
    "value": [
      "media/video/02.mp4",
      "media/video/02_hd.mp4"
    ]
  },
  {
    "key": "path-1-quality",
    "value": [
      "SD",
      "HD"
    ]
  },
  {
    "key": "subtitle-0-label",
    "value": [
      "English",
      "German",
      "Spanish"
    ]
  },
  {
    "key": "subtitle-0-src",
    "value": [
      "data/subtitles/sintel-en.vtt",
      "data/subtitles/sintel-de.vtt",
      "data/subtitles/sintel-es.vtt"
    ]
  },
  {
    "key": "subtitle-1-label",
    "value": [
      "German",
      "Spanish"
    ]
  },
  {
    "key": "subtitle-1-src",
    "value": [
      "data/subtitles/tumblr-de.vtt",
      "data/subtitles/tumblr-es.vtt"
    ]
  }
]

这是期望的结果(为每个不同的键创建新数组):

 var arr = [
        [
              {
                "mp4": "media/video/01.mp4",
                "quality": "720p"
              },
              {
                "mp4": "media/video/01_hd.mp4",
                "quality": "1080p"
              },
        ],
        [
              {
                "mp4": "media/video/02.mp4",
                "quality": "SD"
              },
              {
                "mp4": "media/video/02_hd.mp4",
                "quality": "HD"
              },
        ],
],
arr2 = [        
    [
        {
            "label": "English",
            "src": "data/subtitles/sintel-en.vtt",
        },
        {
            "label": "German",
            "src": "data/subtitles/sintel-de.vtt"
        },
        {
            "label": "Spanish",
            "src": "data/subtitles/sintel-es.vtt"
        }
    ],
    [
        {
            "label": "Spanish",
            "src": "data/subtitles/tumblr-es.vtt",
        },
        {
            "label": "German",
            "src": "data/subtitles/tumblr-de.vtt"
        }
    ]
 ]

标签: javascriptobject

解决方案


您可以拆分key属性,省略第一个path并将其余部分作为索引和键。然后创建一个新数组,如果不存在并分配值。

var data = [{ key: "path-0-mp4", value: ["media/video/01.mp4", "media/video/01_hd.mp4"] }, { key: "path-0-quality", value: ["720p", "1080p"] }, { key: "path-1-mp4", value: ["media/video/02.mp4", "media/video/02_hd.mp4"] }, { key: "path-1-quality", value: ["SD", "HD"] }],
    result = data.reduce((r, { key, value }) => {
        let [, i, k] = key.split('-');
        r[i] = r[i] || [];
        value.forEach((v, j) => (r[i][j] = r[i][j] || {})[k] = v);
        return r;
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

如果您想按 的第一部分进行分组key,您可以将该组的对象作为键,然后按上述方式分配其余部分。

var data = [{ key: "path-0-mp4", value: ["media/video/01.mp4", "media/video/01_hd.mp4"] }, { key: "path-0-quality", value: ["720p", "1080p"] }, { key: "path-1-mp4", value: ["media/video/02.mp4", "media/video/02_hd.mp4"] }, { key: "path-1-quality", value: ["SD", "HD"] }, { key: "subtitle-0-label", value: ["English", "German", "Spanish"] }, { key: "subtitle-0-src", value: ["data/subtitles/sintel-en.vtt", "data/subtitles/sintel-de.vtt", "data/subtitles/sintel-es.vtt"] }, { key: "subtitle-1-label", value: ["German", "Spanish"] }, { key: "subtitle-1-src", value: ["data/subtitles/tumblr-de.vtt", "data/subtitles/tumblr-es.vtt"] }],
    result = data.reduce((r, { key, value }) => {
        let [group, i, k] = key.split('-');
        if (!r[group]) r[group] = [];
        if (!r[group][i]) r[group][i] = [];
        value.forEach((v, j) => {
            if (!r[group][i][j]) r[group][i][j] = {};
            r[group][i][j][k] = v;
        });
        return r;
    }, {});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


推荐阅读