ES6 - 根据特定键的存在操作数组对象
ES6 - manipulate Object of arrays based on the existence of certain keys
我正在尝试根据键重新组合对象值。重组的条件是
密钥必须是“APTC/IndianEligibility2”或“APTC/CSR”。
如果这些键存在于 eligibilityGroupingMap 对象中,则追加
它们的值到键“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);
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 错误:
- 在回调中,您声明了参数
accValue
和 currValue
,但您将这些参数用作 acc
和 key
,您应该使用相同的参数姓名。
- 您正在检查
APTC
是否是 sortedEligibilityGroupingMap
的键,但您应该检查 acc
(或 accValue
,取决于您决定使用哪个名称使用)。
- 您不需要删除累加器中的键(这不是错误,只是不需要的)。
我正在尝试根据键重新组合对象值。重组的条件是
密钥必须是“APTC/IndianEligibility2”或“APTC/CSR”。
如果这些键存在于 eligibilityGroupingMap 对象中,则追加 它们的值到键“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);
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 错误:
- 在回调中,您声明了参数
accValue
和currValue
,但您将这些参数用作acc
和key
,您应该使用相同的参数姓名。 - 您正在检查
APTC
是否是sortedEligibilityGroupingMap
的键,但您应该检查acc
(或accValue
,取决于您决定使用哪个名称使用)。 - 您不需要删除累加器中的键(这不是错误,只是不需要的)。