基于递增键的Javascript对象合并数组

基于递增键的Javascript对象合并数组,javascript,object,Javascript,Object,这就是我所拥有的:我想要合并键以“路径-”+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", "10

这就是我所拥有的:我想要合并键以“路径-”+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"
  }
]
这是所需的结果(为每个不同的键创建新数组):


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

var data=[{key:“path-0-mp4”,值:[“media/video/01.mp4”,“media/video/01_hd.mp4”]},{key:“path-0-quality”,值:[“720p”,“1080p”]},{key:“path-1-mp4”,值:[“media/video/02.mp4”,“media/video/02_hd.mp4”]},{key:“path-1-quality”,值:[“SD”,“hd”},
结果=数据.reduce((r,{key,value})=>{
let[,i,k]=key.split('-');
r[i]=r[i]| |[];
forEach((v,j)=>(r[i][j]=r[i][j]| |{})[k]=v);
返回r;
}, []);
控制台日志(结果)

。作为控制台包装{max height:100%!important;top:0;}
我是新手, 这是正确的方法吗

const a=[{“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 resp=[];
for(设i=0;i控制台日志(resp)我发现这更容易阅读和掌握

如果使用reduce,则可以保存作业

const 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”});
newArr=[];
arr.filter(item=>item.key.endsWith(“mp4”))
.forEach(项=>item.value
.forEach((val,i)=>newArr.push({
“mp4”:val,
“质量”:arr.find(qItem=>qItem.key==item.key.replace(“mp4”,“质量”)).value[i]}
)
)
)

log(newArr)
我在这里做的唯一奇怪的事情就是使用一个对象作为查找表,以帮助解决速度复杂的问题。如果你有任何问题,请告诉我

const 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”});
const result=arr.reduce((表,项)=>{
//从“路径1质量”中获取“路径1”
常量路径值=item.key.split('-');
常量路径值=路径值[0]+'-'+路径值[1];
//从“路径1-质量”中获得“质量”
常量键=路径值[2];
//如果已注册路径,则从表中获取索引
设tIndex=table.indexLookup[pathValue];
//如果没有已注册的索引寄存器1
if(tIndex==未定义){
//将索引重新分配到新位置
tIndex=table.result.length;
//注册索引
table.indexLookup[pathValue]=tIndex;
表.结果.推送([]);
}
//赋值
item.value.forEach((值,i)=>{
const arr=table.result[tIndex]| |[];
arr[i]=arr[i]|{124;
arr[i][key]=值;
表.结果[tIndex]=arr;
})
返回表
}, {
indexLookup:{},
结果:[]
}).结果

log(result)
我认为尼娜的方法更优雅,但你的方法似乎确实有效,并且最终也起到了同样的作用。不过,我会将
var
转换为
let
,以便更好地确定变量的范围。谢谢,我觉得这更容易理解。谢谢您的回复,先生。这个解决方案适用于钥匙的任何结尾。但当你使用单个字母时,阅读起来却非常困难variables@mplungjan,所需的结果具有嵌套数组。这是否可以使其接受一个键,以便对不同的键进行分组或区分?如果数组中有几个不同的键,那么需要分组吗?我已编辑了我的问题。您的编辑缺少所需的结果。为什么在一种情况下你有路径,而在另一种情况下,你有一个不同的词。怎么办?(也许最好保持问题原样,针对这个具体问题提出一个新的问题——可能还有你的尝试。)对不起,我添加了期望的结果。基本上,我想要相同的东西,但不同的关键组。我正在考虑将其与原始数组分离,并为每个组调用此函数(path-,subtitle-)。除非有更好的办法?对不起,我错了。不需要(或不再需要)公寓
    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"
        }
    ]
 ]