代码之家  ›  专栏  ›  技术社区  ›  robe007 Leo Aguirre

在reduce中连接同一对象属性中的值

  •  1
  • robe007 Leo Aguirre  · 技术社区  · 6 年前

    我有一个 数组 属于 物体 这样地:

    let array = [{
        "Age": 20,
        "Name": "Kevin"
    }, {
        "Age": 15,
        "Name": "Alfred"
    }, {
        "Age": 30,
        "Name": "Joe"
    }];
    

    我想得到这样一个物体:

    {
        "Age": '20, 15, 30',
        "Name": 'Kevin, Alfred, Joe'
    }
    

    如果我这样做:

    let r = array.reduce(function(pV, cV) {
        Object.keys(cV).map(function(key){
            pV[key] = (pV[key] || []).concat(cV[key]);
        });
        return pV;
    },{});
    
    console.log(r); // { "Age": [20, 15, 30], "Name": ['Kevin', 'Alfred', 'Joe'] }
    

    或者如果我这样做:

    let r = array.reduce(function(pV, cV) {
        Object.keys(cV).map(function(key){
            pV[key] = (pV[key] || '') + ', ' + cV[key];
        });
        return pV;
    },{});
    
    console.log(r); // { "Age": ', 20, 15, 30', "Name": ', Kevin, Alfred, Joe' }
    

    我有点迷路了。关于如何得到我需要的东西的一些想法?

    4 回复  |  直到 6 年前
        1
  •  3
  •   Jonas Wilms    6 年前

    你和第二个appraoch很接近,你只需要确保 , 不会出现,这对于三元比较容易:

    let r = array.reduce(function(pV, cV) {
      Object.keys(cV).map(function(key){
          pV[key] = (pV[key] ? (pV[key] + ", ") :  '') + cV[key];
      });
      return pV;
    },{});
    
        2
  •  2
  •   mickl    6 年前

    您可以尝试使用以下代码 .reduce() Object.keys

    let array = [{
        "Age": 20,
        "Name": "Kevin"
    }, {
        "Age": 15,
        "Name": "Alfred"
    }, {
        "Age": 30,
        "Name": "Joe"
    }];
    
    let result = array.reduce((current,result) => {
    	Object.keys(current).forEach(key => {
    		if(!result[key]){
    			result[key] = current[key];
    		} else {
    			result[key]+= ", " + current[key];
    		}
    	})
    	return result;
    },{});
    
    console.log(result);
        3
  •  2
  •   Bergi    6 年前

    我不会用的 reduce 就像这样,这只是一个光荣的循环:

    let r = {};
    for (const cV of array) {
        for (const key in cV) {
            r[key] = (r[key] || []).concat(cV[key]);
        }
    }
    

    对于功能性方法,其中 map 实际上是有用的,我将迭代嵌套到另一个方向:

    let r = {};
    for (const key of ["Age", "Name"]) { // or Object.keys(array[0])
        r[key] = array.map(function(cV){
            return cV[key];
        }).join(", ");
    }
    
        4
  •  0
  •   Manoj    6 年前

    你也可以这样做。

     array.reduce((a,n)=>{
     a.Age =  a.Age+','+n.Age;
    a.Name = a.Name+','+n.Name;
    return a;
    });
    

    警告!!此方法用于修改对象的实际数组。 如果不打算这样做,那么可以先克隆对象,然后再执行reduce操作。

    我做的 JSON.parse(JSON.stringify(array)) 要克隆阵列,您可以使用自己的方法进行深度克隆。

    JSON.parse(JSON.stringify(array)).reduce((a,n)=>{
     a.Age =  a.Age+', '+n.Age;
    a.Name = a.Name+', '+n.Name;
    return a;
    })