基于递增键的Javascript对象合并数组
这就是我所拥有的:我想要合并键以“路径-”+I开头的对象。并在最终结果中从关键帧中剥离“path-i”基于递增键的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
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"
}
]
]