【问题标题】:How to modify this function to merge the values of a key?如何修改此函数以合并键的值?
【发布时间】:2016-11-24 11:02:40
【问题描述】:

我希望合并对象“userName”中“year”键的值。

我有以下对象数组

userName=[{
            loginName:'jimmy',
            deviation:[{dates:[20150222,20150223,20150224,20150225], type:'vacation'}],
            year:'2015'
          },
         {
           loginName:'jimmy',
           deviation:[{dates:[20150322,20150323,20150324,20150325], type:'sick'}],
           year:'2016'
         },
         {
          loginName:'chloe',
          deviation:[{dates:[20150222,20150221,20150224,20150225], type:'national free day'}],
          year:'2016'
         },
        ];      

通过使用此功能,我可以根据登录名对偏差日期进行排序。所以在这种情况下,用户 'jimmy' 将只显示一次,但所有的偏差日期和类型都会组合在一起。然而,键 'year' 的值仅继承第一个值并保持不变。如何合并键'year',以便通过修改我当前的功能,对于用户'jimmy' year 将显示'2015, 2016':

var mergedUsername = [];

    userName.forEach(function(deviation) { 
       var existing = mergedUsername.filter(function(v, i) { 
       return v.loginName == deviation.loginName; 
       }); 
    if(existing.length) {
      var existingIndex = mergedUsername.indexOf(existing[0]);
      mergedUsername[existingIndex].deviation = mergedUsername[existingIndex].deviation.concat(deviation.deviation); 
    }  else {
        if(typeof deviation.deviation == 'string')
        deviation.deviation = [deviation.deviation];
        mergedUsername.push(deviation);  
     }
    });

提前致谢!

【问题讨论】:

  • 请添加想要的结果。

标签: javascript object key concatenation


【解决方案1】:

您可以使用reduce() 来获得想要的结果。

var data = [{
  loginName: 'jimmy',
  deviation: [{
    dates: [20150222, 20150223, 20150224, 20150225],
    type: 'vacation'
  }],
  year: '2015'
}, {
  loginName: 'jimmy',
  deviation: [{
    dates: [20150322, 20150323, 20150324, 20150325],
    type: 'sick'
  }],
  year: '2016'
}, {
  loginName: 'chloe',
  deviation: [{
    dates: [20150222, 20150221, 20150224, 20150225],
    type: 'national free day'
  }],
  year: '2016'
}];

var o = {}
var result = data.reduce(function(r, e) {
  if (!o[e.loginName]) {
    o[e.loginName] = e;
    r.push(o[e.loginName]);
  } else {
    o[e.loginName].deviation[0].dates.push(...e.deviation[0].dates)
    o[e.loginName].deviation[0].type += ' ' + e.deviation[0].type
    o[e.loginName].year += ' ' + e.year
  }
  return r;
}, [])

console.log(result)

【讨论】:

  • 您好,感谢您的回复。我尝试了您的方法,在浏览器中效果很好并输出了想要的结果。但是我从客户端动态地获取了我的用户名数组,当我使用您的函数生成文档时,它会打印出一个空白页。正如我所说,我在控制台中没有错误。知道为什么会这样吗?
  • 不知道你的代码很难说。你能用你的代码做一个jsfiddle吗?
  • 我对此表示怀疑,我使用占位符作为键值,我只能使代码在我们的 web 客户端上工作,它可以识别这些占位符。
  • 感谢代码。我有兴趣了解更多关于“reduce()”函数以及如何使用它的信息。你能给我推荐一些带有示例或练习的网站吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 2018-08-26
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多