将对象与重复的键/值对组合在一起

时间:2018-05-10 02:52:22

标签: javascript

我有一个具有重复键/值对的对象数组。我用.map()来操纵它的结构。我想通过将属性System.Title作为附加对象添加到共享相同Title的项目来组合这些重复对。

var doctypes = [{
  "System": {
    "Title": "FIS NetImage"
  },
  "Title": "Notices",
}, {
  "System": {
    "Title": "OmniView"
  },
  "Title": "Notices",
}, {
  "System": {
    "Title": "Nautilus"
  },
  "Title": "Reports",
}, {
  "System": {
    "Title": "FIS NetImage"
  },
  "Title": "Statements",
}]

var modDocTypes = doctypes.map(modDocType => ({
  Title: modDocType.Title,
  System: [{
    Title: modDocType.System.Title
  }]
}))

console.log(modDocTypes)

// DESIRED OUTCOME:
//[
//  {
//    "Title": "Notices",
//    "System": [
//      {
//        "Title": "FIS NetImage"
//      },
//      {
//        "Title": "OmniView"
//      }
//    ]
//  },
//  {
//    "Title": "Reports",
//    "System": [
//      {
//        "Title": "Nautilus"
//      }
//    ]
//  },
//  {
//    "Title": "Statements",
//    "System": [
//      {
//        "Title": "FIS NetImage"
//      }
//    ]
//  }
//]

我该如何做到这一点?

1 个答案:

答案 0 :(得分:2)

由于输入数组对象和输出数组对象不是一对一的,因此您必须使用reduce来组合相同的Title



const input = [{
  "System": {
    "Title": "FIS NetImage"
  },
  "Title": "Notices",
}, {
  "System": {
    "Title": "OmniView"
  },
  "Title": "Notices",
}, {
  "System": {
    "Title": "Nautilus"
  },
  "Title": "Reports",
}, {
  "System": {
    "Title": "FIS NetImage"
  },
  "Title": "Statements",
}];
const output = input.reduce((a, { Title, System }) => {
  const foundTitleObj = a.find(obj => obj.Title === Title);
  if (foundTitleObj) {
    foundTitleObj.System.push(System);
    return a;
  }
  const newTitleObj = {
    Title,
    System: [ System ],
  };
  a.push(newTitleObj);
  return a;
}, []);
console.log(output);