将对象数组重新格式化为键数组数组
Reformat an array of objects to an array of key'd arrays
所以我是 Javascript 的新手,但我正在尝试将 startArray 重新格式化为 endArray。 startArray 基本上是一个订单对象数组,它们始终具有不同的 orderId,但可以具有相同的 companyId。我基本上是在尝试将其切换为基于公司,因此对于每个 companyId,都有一个包含所有公司订单的数组。我一直在修补并试图解决这个问题,但老实说,我不确定从哪里开始,或者这种操作是否可行。
我正在研究 Google Apps 脚本,我认为它仍然是 ES5 语法,如果可能的话,我更愿意坚持使用 vanilla javascript。
var startArray = [
{"companyId" : 1,
"orderId" : 25,
"product" : "productA"
"quantity" : 2,
"price" : 10,
},
{"companyId" : 1,
"orderId" : 20,
"product" : "productB"
"quantity" : 3,
"price" : 5,
},
{"companyId" : 2,
"orderId" : 15,
"product" : "productA"
"quantity" : 5,
"price" : 10,
}
]
var endArray = [ {
'1' = [{"orderId" : 25,
"product" : "productA"
"quantity" : 2,
"price" : 10,},
{"orderId" : 20,
"product" : "productB"
"quantity" : 3,
"price" : 5,}
},{
'2' = [{"orderId" : 15,
"product" : "productA"
"quantity" : 5,
"price" : 10,
}]
}]
]
如果您认为结果是对象而不是数组没问题,这应该可以完成工作:
var startArray = [
{"companyId" : 1,
"orderId" : 25,
"product" : "productA",
"quantity" : 2,
"price" : 10,
},
{"companyId" : 1,
"orderId" : 20,
"product" : "productB",
"quantity" : 3,
"price" : 5,
},
{"companyId" : 2,
"orderId" : 15,
"product" : "productA",
"quantity" : 5,
"price" : 10,
}
];
var ret = {}
startArray.forEach(company => {
if (!ret[company.companyId]) {
ret[company.companyId] = [];
}
ret[company.companyId].push(company);
});
console.log(ret);
如果您不支持 ES6,只需使用经典 for in
循环而不是 forEach
。
使用类似 reduce
的方式创建一个新对象,插入一个数组作为 companyId
的键(如果它不存在的话):
function reduce(arr, callback, initialVal) {
var accumulator = (initialVal === undefined) ? undefined : initialVal;
for (var i = 0; i < arr.length; i++) {
if (accumulator !== undefined)
accumulator = callback.call(undefined, accumulator, arr[i], i, this);
else
accumulator = arr[i];
}
return accumulator;
}
var startArray = [
{"companyId" : 1,
"orderId" : 25,
"product" : "productA",
"quantity" : 2,
"price" : 10,
},
{"companyId" : 1,
"orderId" : 20,
"product" : "productB",
"quantity" : 3,
"price" : 5,
},
{"companyId" : 2,
"orderId" : 15,
"product" : "productA",
"quantity" : 5,
"price" : 10,
}
];
var endObj = reduce(startArray, function (accum, item) {
var companyId = item.companyId;
if (!accum[companyId]) accum[companyId] = [];
delete item.companyId;
accum[companyId].push(item);
return accum;
}, {});
console.log(endObj);
所以我是 Javascript 的新手,但我正在尝试将 startArray 重新格式化为 endArray。 startArray 基本上是一个订单对象数组,它们始终具有不同的 orderId,但可以具有相同的 companyId。我基本上是在尝试将其切换为基于公司,因此对于每个 companyId,都有一个包含所有公司订单的数组。我一直在修补并试图解决这个问题,但老实说,我不确定从哪里开始,或者这种操作是否可行。
我正在研究 Google Apps 脚本,我认为它仍然是 ES5 语法,如果可能的话,我更愿意坚持使用 vanilla javascript。
var startArray = [
{"companyId" : 1,
"orderId" : 25,
"product" : "productA"
"quantity" : 2,
"price" : 10,
},
{"companyId" : 1,
"orderId" : 20,
"product" : "productB"
"quantity" : 3,
"price" : 5,
},
{"companyId" : 2,
"orderId" : 15,
"product" : "productA"
"quantity" : 5,
"price" : 10,
}
]
var endArray = [ {
'1' = [{"orderId" : 25,
"product" : "productA"
"quantity" : 2,
"price" : 10,},
{"orderId" : 20,
"product" : "productB"
"quantity" : 3,
"price" : 5,}
},{
'2' = [{"orderId" : 15,
"product" : "productA"
"quantity" : 5,
"price" : 10,
}]
}]
]
如果您认为结果是对象而不是数组没问题,这应该可以完成工作:
var startArray = [
{"companyId" : 1,
"orderId" : 25,
"product" : "productA",
"quantity" : 2,
"price" : 10,
},
{"companyId" : 1,
"orderId" : 20,
"product" : "productB",
"quantity" : 3,
"price" : 5,
},
{"companyId" : 2,
"orderId" : 15,
"product" : "productA",
"quantity" : 5,
"price" : 10,
}
];
var ret = {}
startArray.forEach(company => {
if (!ret[company.companyId]) {
ret[company.companyId] = [];
}
ret[company.companyId].push(company);
});
console.log(ret);
如果您不支持 ES6,只需使用经典 for in
循环而不是 forEach
。
使用类似 reduce
的方式创建一个新对象,插入一个数组作为 companyId
的键(如果它不存在的话):
function reduce(arr, callback, initialVal) {
var accumulator = (initialVal === undefined) ? undefined : initialVal;
for (var i = 0; i < arr.length; i++) {
if (accumulator !== undefined)
accumulator = callback.call(undefined, accumulator, arr[i], i, this);
else
accumulator = arr[i];
}
return accumulator;
}
var startArray = [
{"companyId" : 1,
"orderId" : 25,
"product" : "productA",
"quantity" : 2,
"price" : 10,
},
{"companyId" : 1,
"orderId" : 20,
"product" : "productB",
"quantity" : 3,
"price" : 5,
},
{"companyId" : 2,
"orderId" : 15,
"product" : "productA",
"quantity" : 5,
"price" : 10,
}
];
var endObj = reduce(startArray, function (accum, item) {
var companyId = item.companyId;
if (!accum[companyId]) accum[companyId] = [];
delete item.companyId;
accum[companyId].push(item);
return accum;
}, {});
console.log(endObj);