【问题标题】:Javascript: Merging / renaming similar objects in array by same key/valueJavascript:通过相同的键/值合并/重命名数组中的相似对象
【发布时间】:2018-11-02 10:30:37
【问题描述】:

使用此示例对象数组:

[{
   "Element ID": "299",
   "Element Name": "Manager",
   "Scale ID": "IM",
   "Data Value": "3.5"
},
{
   "Element ID": "299",
   "Element Name": "Manager",
   "Scale ID": "LV",
   "Data Value": "3"
},
{
   "Element ID": "300",
   "Element Name": "FinTech",
   "Scale ID": "IM",
   "Data Value": "1.75"
},
{
   "Element ID": "300",
   "Element Name": "FinTech",
   "Scale ID": "LV",
   "Data Value": "1.38"`
}]

我写了这段代码来合并Element ID的重复对象并重命名一些元素:

let p = {};
const output = input
  .map(s => {
    if (_.isEmpty(p)) {
      p = s;
      return {};
    }
    if (p['Element ID'] !== s['Element ID']) return {};
    const result = {
      name: s['Element Name'],
      id: s['Element ID'],
      importance:
        p['Scale ID'] === 'IM'
          ? p['Data Value']
          : s['Scale ID'] === 'IM'
            ? s['Data Value']
            : null,
      level:
        p['Scale ID'] === 'LV'
          ? p['Data Value']
          : s['Scale ID'] === 'LV'
            ? s['Data Value']
            : null,
    };
    p = {};
    return result;
  })
  .filter(n => Object.keys(n).length);

所以它现在输出所需的格式:

[{
   "name": "Manager",
   "id": "299",
   "importance": "3.5",
   "level": "3"
},
{
   "name": "FinTech",
   "id": "300",
   "importance": "1.75",
   "level": "1.38"
}]

这是一个复杂的方法,如果输入对象数组在数组中没有两个彼此相邻的完全相同的对象,则会失败。有没有更好的方法通过lodash.reduce() 或我不考虑的类似方法?

【问题讨论】:

    标签: javascript node.js functional-programming lodash


    【解决方案1】:

    试试这个:

    const resultObject = originalArray.reduce((result, element) => {
      const id = element["Element ID"];
      const resultElement = result[id] || { 
        id,
        name: element["Element Name"],
      };
    
      switch (element["Scale ID"]) {
        case "LV":
          resultElement.level = element["Data Value"] || null;
          break;
        case "IM":
          resultElement.importance = element["Data Value"] || null;
          break;
      }
    
    
      return {
        ...result,
        [id]: resultElement,
      }
    }, {});
    
    const resultArray = Object.keys(resultObject).reduce((result, key) => ([
      ...result,
      {
        "id": key,
        ...resultObject[key],
      }
    ]), []);
    

    originalArray 是您的数据。

    您可以通过将键移动到常量中来改进这一点。试着让你的代码可读。算法没有那么复杂。避免将库用于此类简单任务。 Javascript 已经很强大了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 2018-01-25
      • 2019-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多