ES6 - 根据特定键的存在操作数组对象

ES6 - manipulate Object of arrays based on the existence of certain keys

我正在尝试根据键重新组合对象值。重组的条件是

我面临的问题是“无法读取未定义的 Javascript 的 属性 'push'”。尝试通过引用其他堆栈溢出帖子来修复它。最近 2 天都卡在里面了。

const eligibilityGroupingMap = {
    "CHIP": [
        "CHILD3",
        "CHILD4"
    ],
    "APTC": [
        "SELF1"
    ],
    "APTC/IndianEligibility2": [
        “SPOUSE2”
    ],
    "Ineligible": [
        "CHILD7"
    ],
    "APTC/CSR": [
        "CHILD4"
    ] };

预期结果:

eligibilityGroupingMap = {
    "CHIP": [
        "CHILD3",
        "CHILD4"
    ],
    "APTC": [
        "SELF1”, “SPOUSE2”, “CHILD4"
    ],
    "CSR": [
        "CHILD4"
    ]
    "Ineligible": [
        "CHILD7"
    ], };

代码Fiddle

const sortedEligibilityGroupingMap = Object.fromEntries(Object.entries(eligibilityGroupingMap).sort());

const sortedMember = Object.keys(sortedEligibilityGroupingMap).reduce((accValue, currValue) => {
        let array = sortedEligibilityGroupingMap[key];
        if(key === 'APTC/CSR' || key === 'APTC/IndianEligibility2' || key === 'APTC/IndianEligibility3') {
            // eslint-disable-next-line no-prototype-builtins
            if('APTC' in sortedEligibilityGroupingMap){
                acc['APTC'].push.apply(sortedEligibilityGroupingMap[key]);
            } else {
                acc.APTC = {};
                acc.APTC = sortedEligibilityGroupingMap[key];
            }
        }
        acc[key] = array.sort();
        delete acc['APTC/CSR'];
          delete acc['APTC/IndianEligibility2'];
                delete acc['APTC/IndianEligibility3'];
                return acc;
}, {});

console.log('sortedMember'. sortedMember);

const eligibilityGroupingMap = {
  CHIP: ["CHILD3", "CHILD4"],
  APTC: ["SELF1"],
  "APTC/IndianEligibility2": ["SPOUSE2"],
  Ineligible: ["CHILD7"],
  "APTC/CSR": ["CHILD4"],
};

const sortedEligibilityGroupingMap = Object.fromEntries(
  Object.entries(eligibilityGroupingMap).sort()
);


let arrayOfKeyMapping = {
  "APTC/CSR": ["APTC", "CSR"],
  "APTC/IndianEligibility2": ["APTC"],
};

let groupedObject = {};

Object.entries(sortedEligibilityGroupingMap).map(([key, value]) => {
  if (arrayOfKeyMapping[key]) {
    let keyList = arrayOfKeyMapping[key];
    keyList.map((mkey) => {
      if (groupedObject.hasOwnProperty(mkey)) {
        groupedObject[mkey].push(...value);
      } else {
        groupedObject[mkey] = [...value];
      }
    });
  } else {
    groupedObject = { ...groupedObject, [key]: value };
  }
});

console.log("final Result", groupedObject);

可能这个问题太复杂了,我理解起来有些困难,但是为什么不使用循环来做一些更简单的事情呢?类似于:

const copy = {...eligibilityGroupingMap};
copy.APTC = [
  ...(eligibilityGroupingMap.APTC || []),
  ...(eligibilityGroupingMap['APTC/IndianEligibility2'] || []),
  ...(eligibilityGroupingMap['APTC/CSR'] || [])
];
delete copy['APTC/IndianEligibility2'];
delete copy['APTC/CSR'];

如果您希望保留您的代码,有几个 js 错误:

  1. 在回调中,您声明了参数 accValuecurrValue,但您将这些参数用作 acckey,您应该使用相同的参数姓名。
  2. 您正在检查 APTC 是否是 sortedEligibilityGroupingMap 的键,但您应该检查 acc(或 accValue,取决于您决定使用哪个名称使用)。
  3. 您不需要删除累加器中的键(这不是错误,只是不需要的)。