Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将具有重复值的字符串数组转换为基于索引的对象数组_Javascript_Arrays_Json_Javascript Objects - Fatal编程技术网

Javascript 将具有重复值的字符串数组转换为基于索引的对象数组

Javascript 将具有重复值的字符串数组转换为基于索引的对象数组,javascript,arrays,json,javascript-objects,Javascript,Arrays,Json,Javascript Objects,假设我有这样一个列表结构: [ "id1", "01-01-2019", "name1", "€ 5,60", "id2", "02-01-2019", "name2", "€ 5,70", "id3", "03-01-2019", "name3", "€ 5,20", ... ] [ { "id": "id1", "date": "01-01-2019", "name": "name1",

假设我有这样一个列表结构:

[
    "id1", "01-01-2019", "name1", "€ 5,60",
    "id2", "02-01-2019", "name2", "€ 5,70",
    "id3", "03-01-2019", "name3", "€ 5,20",
    ...
]
[
    {
        "id": "id1", 
        "date": "01-01-2019", 
        "name": "name1", 
        "value": "€ 5,60"
    },
    {
        "id": "id2", 
        "date": "02-01-2019", 
        "name": "name2", 
        "value": "€ 5,70"
    },
    {
        "id": "id3", 
        "date": "03-01-2019", 
        "name": "name3", 
        "value": "€ 5,20"
    },
    ...
]
我想将其转换为包含json对象的列表,如下所示:

[
    "id1", "01-01-2019", "name1", "€ 5,60",
    "id2", "02-01-2019", "name2", "€ 5,70",
    "id3", "03-01-2019", "name3", "€ 5,20",
    ...
]
[
    {
        "id": "id1", 
        "date": "01-01-2019", 
        "name": "name1", 
        "value": "€ 5,60"
    },
    {
        "id": "id2", 
        "date": "02-01-2019", 
        "name": "name2", 
        "value": "€ 5,70"
    },
    {
        "id": "id3", 
        "date": "03-01-2019", 
        "name": "name3", 
        "value": "€ 5,20"
    },
    ...
]

在JavaScript中执行此任务最有效的方法是什么?

我将使用一个简单的
while
循环和一个预先断言:

console.assert(data.length % 4 === 0); // Or whatever you use for assertions
const result = [];
let i = 0;
while (i < data.length) {
    result.push({
        id: data[i++],
        date: data[i++],
        name: data[i++],
        value: data[i++]
    });
}

我认为这种方法将是最有效的,因为循环运行了1/4次。如果您有任何其他建议,请随时提出

const数组=[
“id1”、“01-01-2019”、“名称1”、“5.60欧元”,
“id2”、“2019年1月2日”、“名称2”、“5.70欧元”,
“id3”、“2019年1月3日”、“名称3”、“5.20欧元”,
‘id4’、‘03-01-2019’
];
警察局局长=[];
for(设i=0;ilog('finalArray=',finalArray)将数组分块到子数组中,然后将这些数组映射到对象上:

const arr=[
“id1”、“01-01-2019”、“名称1”、“5.60欧元”,
“id2”、“2019年1月2日”、“名称2”、“5.70欧元”,
“id3”、“2019年1月3日”、“名称3”、“5.20欧元”
]
const result=chunk(arr,4).map(item=>({id:item[0],日期:item[1],名称:item[2],成本:item[3]}))
console.log(结果)
功能块(arr、大小){
常量结果=[]
对于(设i=0;i}
您可以使用
Array.reduce()
在不使用任何循环的情况下执行此操作,方法是在输入数据上每隔4次将一个新项目推送到输出:

const数据=[
“id1”、“01-01-2019”、“名称1”、“5.60欧元”,
“id2”、“2019年1月2日”、“名称2”、“5.70欧元”,
“id3”、“2019年1月3日”、“名称3”、“5.20欧元”,
];
const result=数据减少((acc,u,i,arr)=>{
如果(i%4==0){
acc.push({id:arr[i],日期:arr[i+1],名称:arr[i+2],值:arr[i+3]});
}
返回acc;
}, []);

控制台日志(结果)您可以分解数组的部分结构,并构建一个新的对象以进行推送

constmakeobject=([id,date,name,value])=>({id,date,name,value});
风险值数据=[“id1”、“01-01-2019”、“名称1”、“5,60欧元”、“id2”、“02-01-2019”、“名称2”、“5,70欧元”、“id3”、“03-01-2019”、“名称3”、“5,20欧元],
i=0,
结果=[];
而(i

.as控制台包装{max height:100%!important;top:0;}
您可以使用。这里的钥匙在循环中不是硬编码的。这适用于任何数量的预定义键,只要您有有效的输入数组数据

const数组=[
“id1”、“01-01-2019”、“名称1”、“5.60欧元”,
“id2”、“2019年1月2日”、“名称2”、“5.70欧元”,
“id3”、“2019年1月3日”、“名称3”、“5.20欧元”,
]
常量键=[“id”、“日期”、“名称”、“值”],
长度=array.length/keys.length;
const output=Array.from({length},(u,i)=>
reduce((r,k,j)=>({…r[k]:数组[i*keys.length+j]}),{})
);
console.log(输出)