【问题标题】:ES6 - manipulate Object of arrays based on the existence of certain keysES6 - 根据某些键的存在来操作数组的对象
【发布时间】:2021-11-22 23:56:51
【问题描述】:

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

  • 密钥必须是“APTC/IndianEligibility2”或“APTC/CSR”。

  • 如果这些键在资格分组映射对象中存在,则追加 如果它们的值与键“APTC”和“CSR” 钥匙退出

  • 否则创建这些键并推送值。

  • 推送价值观后删除“APTC/IndianEligibility2”和“APTC/CSR”。

    参考预期结果

我面临的问题是“无法读取未定义 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);

【问题讨论】:

    标签: javascript ecmascript-6


    【解决方案1】:

    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);

    【讨论】:

    • 不知道为什么我的代码不起作用
    【解决方案2】:

    可能这个问题太复杂了,我有一些问题要理解它,但是为什么不使用循环做一些更简单的事情呢?比如:

    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. 您不需要删除累加器中的键(这不是错误,只是不需要)。

    【讨论】:

      猜你喜欢
      • 2018-07-31
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多