Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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_Sorting - Fatal编程技术网

通过对相同元素求和进行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对其进行排序,例如,汇总同一

我在尝试用JavaScript对数组项进行排序和分组时遇到了一些问题。以下是示例输入:

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中具有函数式编程风格。。您可以查看:)