Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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 - Fatal编程技术网

Javascript 获取匹配数组元素的总值

Javascript 获取匹配数组元素的总值,javascript,arrays,Javascript,Arrays,这是我当前的数组 0:{modelNumber: "123456789", balance: { amount:1000, currency:"EUR" }} 1:{modelNumber: "987654321", balance: { amount:2000, currency:"EUR" }} 2:{modelNumber: "322353466", balance: { amount:1500, currency:"GBP" }} 3:{modelNumber: "892347522",

这是我当前的数组

0:{modelNumber: "123456789", balance: { amount:1000, currency:"EUR" }}
1:{modelNumber: "987654321", balance: { amount:2000, currency:"EUR" }}
2:{modelNumber: "322353466", balance: { amount:1500, currency:"GBP" }}
3:{modelNumber: "892347522", balance: { amount:1000, currency:"USD" }}
4:{modelNumber: "931883113", balance: { amount:3000, currency:"INR" }}
5:{modelNumber: "854300564", balance: { amount:2500, currency:"GBP" }}
6:{modelNumber: "931883113", balance: { amount:3000, currency:"INR" }}
7:{modelNumber: "854300564", balance: { amount:3500, currency:"USD" }}
我试图返回一个新数组,包含每种货币和每种货币的总值

如下图所示,返回上面数组中每种货币的总金额

0:{currency: "EUR", totalAmount: 3500}
1:{currency: "GBP", totalAmount: 5000}
2:{currency: "USD", totalAmount: 4500}
3:{currency: "INR", totalAmount: 6000}
我最初的做法是:

//the current array
let theInitialArray = state.vehicle;

const results = theInitialArray.reduce((accumalator, current) => {
    const { currency } = current.balance;
    if (accumalator[currency]) {
        accumalator[currency].push(current);
        return accumalator;
    }
    accumalator[currency] = [current];
    return accumalator;     
}, {});

let frank =  Object.keys(results)
let jim = [];
let expectedOutput = theInitialArray.filter((x) => {
    for (let i=0; i < frank.length; i++) {
        if (x.balance.currency === frank[i]) {
            jim.push({'currency': frank[i], 'amount': x.balance.amount});
        }
    }
});
console.log('expectedOutput', expectedOutput)
return expectedOutput
//当前数组
让初始阵列=state.vehicle;
常数结果=初始阵列减少((累加器,电流)=>{
const{currency}=current.balance;
if(累加器[货币]){
累加器[货币]。推送(当前);
回程累加器;
}
累加器[货币]=[当前];
回程累加器;
}, {});
让frank=Object.keys(结果)
让吉姆=[];
让expectedOutput=theInitialArray.filter((x)=>{
for(设i=0;i
以下是一种获得输出的
O(n)
方法:

  • 首先定义一个空对象
    tempObj
    ,该对象将用于根据
    currency
    键将
    currency
    totalAmount
    值存储为对象
  • 然后,如果在
    tempObj
    中定义了该
    currency
    键,则只需将现有对象的
    金额
    总金额
    相加即可
  • 否则,您将创建一个对象,其中
    amount
    totalAmount
    currency
    tempObj
    key
    ,而
    currency
    forEach
    循环中项目的
    currency
  • 最后,您需要执行
    Object.values(tempObj)
    ,以便获得对象值并忽略
    tempObj
    的键以获得所需的结果
  • var arr=[{型号:“123456789”,余额:{金额:1000,货币:“欧元”},
    {型号:“987654321”,余额:{金额:2000,货币:“欧元”},
    {型号:“322353466”,余额:{金额:1500,货币:“英镑”},
    {型号:“892347522”,余额:{金额:1000,货币:“美元”},
    {型号:“931883113”,余额:{金额:3000,货币:“印度卢比”},
    {型号:“854300564”,余额:{金额:2500,货币:“英镑”},
    {型号:“931883113”,余额:{金额:3000,货币:“印度卢比”},
    {型号:“854300564”,余额:{金额:3500,货币:“美元”}}];
    var tempObj={};
    arr.forEach((obj)=>{
    if(临时对象[对象余额.货币]){
    tempObj[obj.balance.currency].totalAmount+=obj.balance.amount
    }否则{
    临时目标[目标余额.货币]={
    货币:obj.balance.currency,
    合计金额:对象余额金额
    }
    }
    });
    var resArray=Object.values(tempObj);
    控制台日志(重新排列)您可以选择迭代数据。如果累加器中不存在货币(
    r
    在reduce回调中),则初始化它。将当前金额添加到累加器中的货币金额。使用以下方法获取货币数组:

    const data=[{“modelNumber”:“123456789”,“balance”:{“amount”:1000,“currency”:“EUR”},{“modelNumber”:“987654321”,“balance”:{“amount”:2000,“currency”:“EUR”},{“modelnumer”:“3223534466”,“balance”:{“amount”:1500,“currency”:“GBP”},{“modelNumber”:“892347522”,“balance”:{“amount”:1000,“currency”:“USD”},{“modelNumber”:“933113”,“balance”:“amount”:3000,“货币”:“INR”},{“型号编号”:“854300564”,“余额”:{“金额”:2500,“货币”:“英镑”},{“型号编号”:“931883113”,“余额”:{“金额”:3000,“货币”:“INR”},{“型号编号”:“854300564”,“余额”:{“金额”:3500,“货币”:“美元”};
    const result=Object.values(data.reduce((r,{balance})=>{
    常量{金额,货币}=余额;
    如果(!r[currency])r[currency]={currency,金额:0};
    r[货币]。金额+=金额;
    返回r;
    }, {}));
    
    控制台日志(结果)可以减少您拥有的值,并将它们映射到您需要的格式:

    const值=[
    {型号:“123456789”,余额:{金额:1000,货币:“欧元”},
    {型号:“987654321”,余额:{金额:2000,货币:“欧元”},
    {型号:“322353466”,余额:{金额:1500,货币:“英镑”},
    {型号:“892347522”,余额:{金额:1000,货币:“美元”},
    {型号:“931883113”,余额:{金额:3000,货币:“印度卢比”},
    {型号:“854300564”,余额:{金额:2500,货币:“英镑”},
    {型号:“931883113”,余额:{金额:3000,货币:“印度卢比”},
    {型号:“854300564”,余额:{金额:3500,货币:“美元”},
    ];
    常量结果=值。减少((上一个,当前)=>({
    …上一页,
    [货币余额.货币]:(上一个[货币余额.货币]| | 0)+货币余额.金额
    }), {})
    const inCorrectFormat=Object.keys(results.map)(key=>({
    货币:关键,
    totalAmount:结果[关键字]
    }))
    console.dir(inCorrectFormat)
    您可以选择一个并将所需的
    currency
    /
    totalAmount
    对数组作为新对象呈现

    var数据=[{modelNumber:“123456789”,余额:{金额:1000,货币:“欧元”},{modelNumber:“987654321”,余额:{金额:2000,货币:“欧元”},{modelNumber:“322353466”,余额:{金额:1500,货币:“英镑”},{modelNumber:“892347522”,余额:{金额:1000,货币:“美元”},{modelNumber:“931883113”,余额:{金额:3000,货币:“卢比”},{型号编号:“854300564”,余额:{金额:2500,货币:“英镑”},{型号编号:“931883113”,余额:{金额:3000,货币:“卢比”},{型号编号:“854300564”,余额:{金额:3500,货币:“美元”},
    结果=Array.from(
    数据减少((m,{余额:{金额,货币}})=>
    m、 设置(货币,(m.get(货币)| | 0)+金额),新地图),
    ([currency,totalAmount])=>({currency,totalAmount})
    );
    控制台日志(结果)
    
    .as控制台包装{最大高度:100%!重要;顶部:0;}
    我的so
    const res = arr
      // map to currency
      .map(i => i.balance.currency)
      // get unique currency
      .filter((v, i, a) => a.indexOf(v) === i)
      // map to result
      .map((i, a) => ({
        currency: i,
        totalAmount: calcTotalAmount(i)
      }));
    
    // calculate amount
    function calcTotalAmount(currency) {
      return (
        arr
          // filter to current curency
          .filter(i => i.balance.currency === currency)
          // reduce to number
          .reduce((accum, i) => accum + i.balance.amount, 0)
      );
    }
    
    a = [{modelNumber: "123456789", balance: { amount:1000, currency:"EUR" }}, {modelNumber: "987654321", balance: { amount:2000, currency:"EUR" }},{modelNumber: "322353466", balance: { amount:1500, currency:"GBP" }},{modelNumber: "892347522", balance: { amount:1000, currency:"USD" }},{modelNumber: "931883113", balance: { amount:3000, currency:"INR" }},{modelNumber: "854300564", balance: { amount:2500, currency:"GBP" }},{modelNumber: "931883113", balance: { amount:3000, currency:"INR" }},{modelNumber: "854300564", balance: { amount:3500, currency:"USD" }}]
    
    let currencies = [], result = [];
    a.map((v)=>{
      let {currency, amount} = v.balance;
      if(!currencies.includes(currency)){
        currencies.push(currency);
        result.push({currency, totalAmount:amount});
      }else{
        result[currencies.findIndex(vv=>vv===currency)].totalAmount+=amount;
      }
    })