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;
}
})