Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.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 - Fatal编程技术网

Javascript 对同一属性上的值进行分组

Javascript 对同一属性上的值进行分组,javascript,Javascript,我有这样一个数组: [ {unit: 35, brand: 'CENTURY'}, {unit: 35, brand: 'BADGER'}, {unit: 25, brand: 'CENTURY'}, {unit: 15, brand: 'CENTURY'}, {unit: 25, brand: 'XEGAR'} ] 我想要的是混合具有相同单位值的JSON,加入逗号分隔的品牌,这样结果数组将是: [ {unit: 35, brand: 'CENT

我有这样一个数组:

[
    {unit: 35, brand: 'CENTURY'},
    {unit: 35, brand: 'BADGER'},
    {unit: 25, brand: 'CENTURY'},
    {unit: 15, brand: 'CENTURY'},
    {unit: 25, brand: 'XEGAR'}
]
我想要的是混合具有相同单位值的JSON,加入逗号分隔的品牌,这样结果数组将是:

[
    {unit: 35, brand: 'CENTURY, BADGER'},
    {unit: 25, brand: 'CENTURY, XEGAR'},
    {unit: 15, brand: 'CENTURY'}
]
有人建议我使用
filter()
,我在MDN上读到了这方面的内容,但我不明白的是,如何使用上次调用的参数:

使用三个参数调用回调:

  • 元素的值
  • 元素的索引
  • 正在遍历的数组对象
  • 我的意思是,我知道这是一个完整的数组,但是如果我已经对它进行了过滤,这对我有什么帮助

    vm.products.filter(
        function(product, index, products){
            //How do I compare here if product === any product in products
            //and then add mix them up?
        }
    )
    

    迭代元素并生成新数组

    var-arr=[{
    单位:35,
    品牌:“世纪”
    }, {
    单位:35,
    品牌:“獾”
    }, {
    单位:25,
    品牌:“世纪”
    }, {
    单位:15,
    品牌:“世纪”
    }, {
    单位:25,
    品牌:“XEGAR”
    }],
    ind=[],
    res=[];
    //使用forEach或for循环迭代数组
    arr.forEach(功能(v){
    //正在检查单位值是否在'ind'数组中
    var eleIn=ind.indexOf(v.单位);
    如果(eleIn==-1){
    //将单位值推送到'ind'数组
    指示推力(v单位);
    //将数组元素推送到`res`数组
    res.push(v);
    }否则
    //更新品牌价值的其他案例
    res[eleIn].品牌+=','+v.brand;
    })
    document.write(''+JSON.stringify(res,null,3)+'')试试这个

    var data = [
        {unit: 35, brand: 'CENTURY'},
        {unit: 35, brand: 'BADGER'},
        {unit: 25, brand: 'CENTURY'},
        {unit: 15, brand: 'CENTURY'},
        {unit: 25, brand: 'XEGAR'}
    ];
    
    function groupBy(field, data) {
      var result = [];
      var ignore = [];
    
      for (var i = 0; i < data.length; i++) {
        var current = data[i];
        var isNew = true;
    
        // Find matching elements
        for (var j = 0; j < data.length; j++) {
          var test = data[j];
    
          if (test != current && result.indexOf(test) == -1 && ignore.indexOf(test) == -1) {
            // If their fields match
            if (test[field] == current[field]) {
              for (var key in test) {
                if (test.hasOwnProperty(key) && key != field) {
                  if (current.hasOwnProperty(key)) {
                    var currentValues = current[key].split(", ");
                    currentValues.push(test[key]);
                    current[key] = currentValues.join(", ");
                  } else {
                    current[key] = test[key];
                  }
                }
              }
    
              // Add to ignore list
              ignore.push(test);
            }
          }
        }
    
        if (ignore.indexOf(current) == -1) {
          result.push(current);
        }
      }
      return result;
    }
    
    var newData = groupBy('unit', data);
    console.log(JSON.stringify(newData));
    
    var objArray=[
    {单位:35,品牌:'CENTURY'},
    {单位:35,品牌:'獾'},
    {单位:25,品牌:'CENTURY'},
    {单位:15,品牌:'CENTURY'},
    {单位:25,品牌:'XEGAR'}
    ];
    var输出={};
    var outputArr=[];
    对于(变量计数器=0;计数器
    我在上一次会议上提出了一个有点通用的解决方案

    所做的是使用
    字段对数据进行分组。当它找到匹配项时,它会修改具有该
    字段的第一个对象,并将与该
    字段
    匹配的其他实例上的所有属性添加到该对象中。IE:如果要在下面的
    单元35
    实例上添加额外字段,它们将被复制到组合实例中。这可以通过注释掉最里面的
    else
    语句来关闭

    这是密码

    [
        {"unit":35,"brand":"CENTURY, BADGER"},
        {"unit":25,"brand":"CENTURY, XEGAR"},
        {"unit":15,"brand":"CENTURY"}
    ]
    

    OP要求使用
    过滤器
    解决方案。这里有一个,但并不比其他的好

    var-arr=[{
    单位:35,
    品牌:“世纪”
    }, {
    单位:35,
    品牌:“獾”
    }, {
    单位:25,
    品牌:“世纪”
    }, {
    单位:15,
    品牌:“世纪”
    }, {
    单位:25,
    品牌:“XEGAR”
    }]
    var done=[];
    var arr2=arr.map(功能(obj){
    if(done.indexOf(obj.unit)>=0)返回;
    完成。推动(对象单位);
    var arrIn=arr.filter(函数(objIn){
    返回obj.unit==objIn.unit;
    });
    返回{
    单位:arrIn[0]。单位,
    品牌:arrIn.map(功能(obj2){
    返回品牌;
    }).join(“,”)
    };
    });
    
    document.write(JSON.stringify(arr2))
    这是一个具有
    Array.prototype.filter()
    和临时对象的非破坏性解决方案

    var数组=[{单位:35,品牌:'CENTURY'},{单位:35,品牌:'BADGER'},{单位:25,品牌:'CENTURY'},{单位:15,品牌:'CENTURY'},{单位:25,品牌:'XEGAR'}];
    函数过滤器(a){
    var o={};
    返回JSON.parse(JSON.stringify(a)).filter(函数(b){
    如果(!(b.单位为o)){
    o[b.单位]=b;
    返回true;
    }
    o[b.单位].品牌+=','+b.品牌;
    });
    }
    document.write(“”+JSON.stringify(过滤器(数组),0,4)+“”);
    
    write(“”+JSON.stringify(数组,0,4)+“”)
    “这个问题没有显示出任何研究成果”-询问如何处理堆栈溢出本身并不构成研究。我在mdn上读到了
    、filter
    、reduce
    (谢谢聊天),但我真的不知道如何@Jameshorperhaps@Jameshorperhaps包括你使用它们的一些尝试,接下来的问题是,为什么您正在使用的某些特定代码不起作用,而不是“为我编写代码”的问题。尽管像往常一样,其他人似乎很乐意遵守……Thnks@JamesThorpe谢谢你的建议……有没有更简单的方法呢?也许可以使用
    .filter
    ?@feniixx,我添加了一个
    filter
    解决方案,尽管我不认为它比这个更有效、更可读或更简单。
    [
        {"unit":35,"brand":"CENTURY, BADGER"},
        {"unit":25,"brand":"CENTURY, XEGAR"},
        {"unit":15,"brand":"CENTURY"}
    ]