通过对相同元素求和进行JavaScript数组排序
我在尝试用JavaScript对数组项进行排序和分组时遇到了一些问题。以下是示例输入:通过对相同元素求和进行JavaScript数组排序,javascript,arrays,sorting,Javascript,Arrays,Sorting,我在尝试用JavaScript对数组项进行排序和分组时遇到了一些问题。以下是示例输入: var arr = [ {merchantName: '', branchName: 'e', branchAddress: '', total: 10.5}, ]; 我试图实现的输出: var arr = [ {merchantName: '', branchName: '', branchAddress: '', total: 10.5}, ]; 我想按branchName对其进行排序,例如,汇总同一
var arr = [
{merchantName: '', branchName: 'e', branchAddress: '', total: 10.5},
];
我试图实现的输出:
var arr = [
{merchantName: '', branchName: '', branchAddress: '', total: 10.5},
];
我想按branchName对其进行排序,例如,汇总同一branchName的总数,然后同时将所有其他属性(如merchantName和branchAddress)绑定在一起,以便我可以访问它们,如:
for(var i = 0; i < arr.length; i++){
console.log(arr[i].merchantName + ' ' + arr[i].branchName + ' ' + arr[i].branchAddress + ' ' + arr[i].total);
}
for(变量i=0;i
我甚至不知道怎么开始。有什么想法可以实现吗
提前感谢 看起来您需要做两件事:按branchName排序,然后为每个branchName输出一个值(按branchName对结果/组进行重复数据消除) 这里有几个潜在的问题。1) 上面显示的示例输出没有按branchName排序,即使您声明a)您希望它按branchName排序,b)这将是一个示例。其次,输出不是完全确定的——特别是,您似乎只是从branchName输出第一个匹配的记录,因此total属性的值(在同一branchName的记录之间变化)就是显示的值。所以假设您A)希望对结果进行排序,B)不关心“total”属性的值,则可以通过以下方式轻松完成: 一) 对数组进行排序。请参见示例:只需编写一个比较branchName值的比较函数。以及,
二) 循环遍历结果,只要在branchName与前一个值发生更改时输出第一条记录。因此,我将这样做:
branchName
属性将数组分组到hashmap
中-计算总数hashmap
中取出数组并对其进行排序var-arr=[
{商品名称:'Giant',品牌名称:'Giant Marine',品牌名称:'Terrace 56 Branch Blk 56 Marine Terrace#01-259/261 Singapore 440056',总计:10.5},
{商品名称:“Ntuc”,分公司名称:“Ntuc中山购物中心分公司”,分公司地址:“中山购物中心打捆机#02-01,亚胡德路20号,329984”,总计:12.14999999999},
{商品名称:'Giant',branchName:'Giant Kim Keat 260 Branch',branchAddress:'Blk 260 Kim Keat Avenue#01-01 Singapore 310260',总计:5.1},
{商品名称:“Ntuc”,分支机构名称:“Ntuc斯科茨广场分支机构”,分支机构名称:“斯科茨广场B1-03至07和B1-10,斯科茨路6号,228209”,总计:4},
{商品名称:'Ntuc',分公司名称:'Ntuc中山购物中心分公司',分公司地址:'329984阿胡德路20号中山购物中心打捆机#02-01',总计:4},
{商品名称:'Ntuc',分支机构名称:'Ntuc中山购物中心分支机构',分支机构名称:'329984阿胡德路20号中山购物中心打捆机#02-01',总计:8}
];
//创建哈希映射
var hash=arr.reduce(函数(p,c){
如果(!p[c.branchName])
p[c.branchName]=c;
其他的
p[c.branchName].total+=c.total;
返回p;
},Object.create(空))
//现在提取结果并对其进行排序
var result=Object.keys(散列).map(函数(e){
返回散列[e];
}).排序(功能(a、b){
返回a.branchName-b.branchName;
});
控制台日志(结果)代码>
.as控制台包装{top:0;最大高度:100%!important;}
使用
var-arr=[{
商品名称:“巨人”,
布兰克纳姆:“巨人海军”,
branchAddress:“Terrace 56 Branch Blk 56 Marine Terrace#01-259/261新加坡440056”,
总数:10.5
},
{
商品名称:“Ntuc”,
分行名称:“南洋理工大学中山商场分行”,
分公司地址:329984阿胡德路20号中山商场打捆机#02-01号,
总计:12.14999999999
},
{
商品名称:“巨人”,
branchName:“巨人金基特260分行”,
Branchadress:“金基特大道260号Blk#01-01新加坡310260”,
总数:5.1
},
{
商品名称:“Ntuc”,
branchName:“南加州大学斯科茨广场分校”,
分行地址:228209斯科茨路6号斯科茨广场B1-03至07和B1-10,
总数:4
},
{
商品名称:“Ntuc”,
分行名称:“南洋理工大学中山商场分行”,
分公司地址:329984阿胡德路20号中山商场打捆机#02-01号,
总数:4
},
{
商品名称:“Ntuc”,
分行名称:“南洋理工大学中山商场分行”,
分公司地址:329984阿胡德路20号中山商场打捆机#02-01号,
总数:8
}
];
var newArr=arr.reduce(函数(项,项){
var existing=items.find(函数(i){
返回i.branchName==item.branchName;
});
如果(现有){
existing.total+=item.total;
}否则{
项目。推送(项目);
}
退货项目;
}, []);
控制台日志(newArr)代码>非常感谢!但是如何提取属性呢?我尝试了console.log(result.branchName),但它返回我unfinedwell,您应该遍历result
并执行类似result[I]的操作。branchName
…我明白了我明白了。非常感谢!但我想再次确认一下,因为我正在试图理解代码,当您创建哈希映射时,您在哪里引用p&c参数?因为据我所知,你们试图检查branchName是否存在,然后总结总数。如果不创建一个新对象,对吗?在javascript中具有函数式编程风格。。您可以查看:)