如何解决重新排列JavaScript数组
如何重新排列上述格式的数据。我必须重新格式化数组并制作新的数组:
[
{
"cost":"1.3947648891000006","start_date":"2020-06-10","account":"1"
},{
"cost":"1.4069091170999999","start_date":"2020-06-11",{
"cost":"1.401164025099997","account":"2"
},{
"cost":"2.50928182113","start_date":"2020-06-12","account":"2"
}
]
收件人:
[
{
"start_date":"2020-06-10","account_1_cost":"1.3947648891000006"
},{
"start_date":"2020-06-11","account_1_cost":"1.4069091170999999","account_2_cost":"1.401164025099997"
},{
"start_date":"2020-06-12","account_2_cost":"2.50928182113"
}
]
我尝试过reduce函数和map函数都没有用。
解决方法
这是获得所需输出的简单方法。
只需创建start_date
的字典,然后将account_i_cost
添加到带有接收日期的字典即可。最后,获取字典的所有值。
var arr = [{"cost":"1.3947648891000006","start_date":"2020-06-10","account":"1"},{"cost":"1.4069091170999999","start_date":"2020-06-11",{"cost":"1.401164025099997","account":"2"},{"cost":"2.50928182113","start_date":"2020-06-12","account":"2"}];
let objMap={}
arr.forEach(obj=>{
let field=`account_${obj.account}_cost`
objMap[obj.start_date]=objMap[obj.start_date]?{...objMap[obj.start_date],[field]:obj.cost}:{
"start_date":obj.start_date,[field]:obj.cost
}
})
let result=Object.values(objMap)
console.log(result)
,
您可以分两步进行操作,首先是使用N
按start_date
进行分组,然后将其映射回数组:
reduce
,
在这种情况下,正确的工具是Array.prototype.reduce()
。
reduce()
方法在数组的每个元素上执行 reducer 函数(由您提供),从而产生单个输出值。
查看评论:
var account_data = [
{
"cost":"1.3947648891000006","account":"1"
},{
"cost":"1.4069091170999999",{
"cost":"1.401164025099997","account":"2"
},{
"cost":"2.50928182113","account":"2"
}
];
var refactored = account_data.reduce(function(new_object,current_item){
// Get the essential information from the current item
let {start_date,cost} = current_item;
let cost_key = `account_${current_item.account}_cost`;
// If there isn't a key for this date,create it
if(!new_object[start_date]){
new_object[start_date] = {start_date};
}
// Add the relevant info for the current date
new_object[start_date][cost_key] = cost;
return new_object;
},{});
// Flatten it into an array
refactored = Object.values(refactored);
console.log(refactored);
,
只需使用array.reduce
const arr =
[ { cost: '1.3947648891000006',start_date: '2020-06-10',account: '1' },{ cost: '1.4069091170999999',start_date: '2020-06-11',{ cost: '1.401164025099997',account: '2' },{ cost: '2.50928182113',start_date: '2020-06-12',account: '2' }
]
const res =
arr.reduce((acc,{cost,start_date,account})=>
{
let el = acc.find(x=>x.start_date===start_date)
if (!el) acc.push(el = { start_date })
el[`account_${account}_cost`] = cost
return acc
},[])
console.log( res )
.as-console-wrapper { max-height: 100% !important; top: 0; }
,
我强烈建议不要使用数组,而应该使用以日期为键的字典。
然后输入此代码:
// list = (...)
list.reduce((prev,curr) => {
if (!prev.hasOwnProperty(curr.start_date)) {
prev[curr.start_date] = {};
}
prev[curr.start_date][`account_${curr.account}_cost`] = curr.cost;
return prev;
},{})
将为您提供此结果:
{
"2020-06-10":{
"account_1_cost":"1.3947648891000006"
},"2020-06-11":{
"account_1_cost":"1.4069091170999999","account_2_cost":"1.401164025099997"
},"2020-06-12":{
"account_2_cost":"2.50928182113"
}
}
但是,如果您真的想要它,请尝试以下方法:
list.reduce((prev,curr) => {
let elemWithDate = prev.find(el => el['start_date'] === curr['start_date']);
if (!elemWithDate) {
prev.push({'start_date': curr['start_date']});
elemWithDate = prev[prev.length - 1];
}
elemWithDate[`account_${curr.account}_cost`] = curr.cost;
return prev;
},[]);
,
在数组上遍历foreach,并查看哈希图中是否有该对象日期的条目。如果是这样,则只需将新属性account_x_cost添加到结果数组的相应元素(通过哈希中的索引)。否则,在resultArray中为此对象创建一个新条目,并将日期作为索引添加到哈希中。
let arr = [
{ "cost": "1.3947648891000006","start_date": "2020-06-10","account": "1" },{ "cost": "1.4069091170999999","start_date": "2020-06-11",{ "cost": "1.401164025099997","account": "2" },{ "cost": "2.50928182113","start_date": "2020-06-12","account": "2" }
];
let result = [];
let hash = [];
arr.forEach(obj => {
let index = hash.indexOf(obj.start_date);
if (index==-1) {
result.push({start_date: obj.start_date,['account' + obj.account + '_cost']: obj.cost});
hash.push(obj.start_date);
} else {
result[index]['account' + obj.account + '_cost'] = obj.cost;
}
});
console.log(result);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。