使用JavaScript,如何将一个名称列表与来自相关数据项列表的聚合数据值进行映射?

如何解决使用JavaScript,如何将一个名称列表与来自相关数据项列表的聚合数据值进行映射?

也许有人可以给我一个主意,我该怎么做。因此,我有一组名称["Tom","Jane","Mike","John"],还有一组对象是购买报告:

[
  { date: "19/02/2019",name: "Mike",amount: 10 },{ date: "20/02/2019",amount: 15 },{ date: "21/10/2019",name: "Jane",amount: 25 },{ date: "22/03/2019",name: "John",amount: 30 },{ date: "19/03/2019",name: "Tom",amount: 15 }
]

我需要获得代表一个人的物品及其总花费额。 [{ name: "Tom",{ name: "Mike",...我希望你明白。我该如何实现?我尝试map对象的名称和过滤器数组,但得到undefined

解决方法

结合使用map,filter和reduce来整理数据:

第一个.map正在构建对象结构,例如{name: '...',amount: <val>}

为了获取每个名称的值,您可以按名称过滤支出,并通过添加来减少输出值。

const names = ["Tom","Jane","Mike","John"];

const spendings = [{
  date: "19/02/2019",name: "Mike",amount: 10
},{
  date: "20/02/2019",amount: 15
},{
  date: "21/10/2019",name: "Jane",amount: 25
},{
  date: "22/03/2019",name: "John",amount: 30
},{
  date: "19/03/2019",name: "Tom",amount: 15
}];



const result = names.map(name => {
  return {
    name,amount: spendings.filter(spending => spending.name === name).reduce((sum,{
      amount
    }) => sum + amount,0)
  };
});

console.log(result);

,

您可以尝试以下代码:

const data = [
  { date: "19/02/2019",amount: 10 },{ date: "20/02/2019",amount: 15 },{ date: "21/10/2019",amount: 25 },{ date: "22/03/2019",amount: 30 },{ date: "19/03/2019",];

const names = ["Tom","John"];

const results = names.map((name) => ({
  name,amount: data
    .filter(({ name: dataName }) => dataName === name)
    .reduce((total,{ amount }) => total + amount,0),}));

console.log(results);
.as-console-wrapper { min-height: 100%!important; top: 0; }

,

在报表数组上使用 Array.reduce

然后将报告数组简化为每个名称的总报告字典。


请先尝试自行解决。
这是我的解决方案:

const dictionaryReports = reports.reduce((prev,curr)=>{
if(!prev[curr.name]) {
 return {...prev,prev[curr.name] : curr}
}else{
  return {
       ...prev,prev[curr.name]:
           { 
            ...prev[curr.name],amount : prev[curr.name].amount + curr.amount  
           }
         }
 } 
 
},{})

输出将是:

   dictionaryReports =  {
     Mike : {name:"Mike",amount:25},Tom : {name:"Tom",amount:15}
    }

那么你可以做

Object.values(dictionaryReports)
,

您可以根据需要使用javascript过滤器方法进行设置。

例如。如果要在数组中获取与名称和数量匹配的条目,可以编写如下函数:

const result = (name,cost) => array.filter(customer => {
    return name == customer.name && cost == customer.cost;
});

运行结果(“简”,25)将返回以下内容:

[{date: "21/10/2019",amount: 25}]
,

您可以使用所需名称创建一个对象,然后将金额添加到每个属性中。

const 
    names = ["Tom","John"],purchases = [{ date:"19/02/2019",amount: 15 }],result = purchases.reduce(
        (object,{ name,amount }) => (object[name] += amount,object),Object.fromEntries(names.map(name => [name,0]))
    );

console.log(result);

,

这种方法尽可能通用。它结合了mapreduce方法,从而使给定数据集(数据列表)和相应(目标)值列表中的任何数据 ,只需为上述 map-reduce 组合提供开始配置即可

const dataset = [
  { date: "19/03/2019",name: "Jerry",amount: 45 },{ date: "19/02/2019",amount: 15 }
];


function aggregateTargetItemValueFromSourceKey(collector,item) {
  const { aggregateValue,sourceKey,targetKey,targetItem } = collector;
  if (targetItem[targetKey] === item[targetKey]) {
    targetItem[sourceKey] = aggregateValue(targetItem[sourceKey],item[sourceKey]);
  }
  return collector;
}

function createTargetItemFromBoundDatasetConfig(targetValue) {
  const { dataset,aggregateValue,initialValue,targetKey } = this;
  return dataset.reduce(aggregateTargetItemValueFromSourceKey,{
    aggregateValue,targetItem: {
      [targetKey]: targetValue,[sourceKey]: initialValue
    }
  }).targetItem;
}


console.log(
  ["Tom","John"]
    .map(createTargetItemFromBoundDatasetConfig,{
      aggregateValue: ((targetValue,sourceValue) => targetValue + sourceValue),initialValue: 0,sourceKey: 'amount',targetKey: 'name',dataset
    })
);

console.log(
  [5,10,15,20,25,30,35,40,45,50]
    .map(createTargetItemFromBoundDatasetConfig,sourceValue) => targetValue.concat(sourceValue)),initialValue: [],sourceKey: 'name',targetKey: 'amount',dataset
    })
);
.as-console-wrapper { min-height: 100%!important; top: 0; }

第二种方法很简单,因此它产生的结果灵活性较差。不过,至少可以选择从提供的数据集中的任何项目中简单地聚合数据,或者,正如所提供的名称列表无意中暗示了OP,可以使用后者仅过滤数据集中的那些项目。实际上是其名称之一。 ...

const dataset = [
  { date: "19/03/2019",amount: 15 }
];
const itemNameList = ["Tom","John"];

function aggregateItemAmountByItemNameWithOptionalNameCeck(collector,item) {
  const { checklist,index,list } = collector;
  const itemName = item.name;

  const isProceed = (!Array.isArray(checklist) || checklist.includes(itemName))
  if (isProceed) {
  
    let targetItem = index[itemName];
    if (!targetItem) {

      targetItem = index[itemName] = {
        name: itemName,amount: 0
      };
      list.push(targetItem);
    }
    targetItem.amount = targetItem.amount + item.amount;
  }
  return collector;
}


console.log(
  'with name check ... ',dataset.reduce(aggregateItemAmountByItemNameWithOptionalNameCeck,{
    checklist: itemNameList,index: {},list: []
  }).list
);
console.log(
  'without name check ... ',{
    index: {},list: []
  }).list
);
.as-console-wrapper { min-height: 100%!important; top: 0; }

,

您可以在购买时使用数组减少方法。您不需要名称数组,我认为它对结果看起来毫无用处。

const purchases = [
  { date: "19/02/2019",amount: 15 }
]

const overall = purchases.reduce((acc,curr) => { 
     const currentUser = acc.find(x => x.name === curr.name);
     if(currentUser) {
        currentUser.amount += curr.amount;
     } else {
       acc.push({name:curr.name,amount: curr.amount})
     }
     return acc;
},[]);


Output

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;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,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;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[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 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 -&gt; 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(&quot;/hires&quot;) 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&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-