重新排列JavaScript数组

如何解决重新排列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)

,

您可以分两步进行操作,首先是使用Nstart_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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-