Javascript 将具有相似键的对象插入到数组中,键是否存在
这可能是我无法解决的一个基本问题。我从API接收了一个初始数组值,如下所示:Javascript 将具有相似键的对象插入到数组中,键是否存在,javascript,arrays,object,reduce,Javascript,Arrays,Object,Reduce,这可能是我无法解决的一个基本问题。我从API接收了一个初始数组值,如下所示: const primaryArray = [ { startDate: '01-01-2021', endDate: '11-01-2021', refs: [ { refId: "FL013", year: "2021" } ] }, { star
const primaryArray = [
{
startDate: '01-01-2021',
endDate: '11-01-2021',
refs: [
{
refId: "FL013",
year: "2021"
}
]
},
{
startDate: '01-02-2021',
endDate: '28-02-2021',
refs: [
{
refId: "FL013",
year: "2021"
}
]
},
{
startDate: '03-05-2020',
endDate: '10-06-2020',
refs: [
{
refId: "FL013",
year: "2020"
}
]
},
{
startDate: '25-03-2019',
endDate: '25-04-2019',
refs: [
{
refId: "FL013",
year: "2019"
}
]
}
];
由于2021年的两个对象与“FL013”共享相同的引用键,我想将它们转换为如下形式,所有对象都从数组中分离出来:
{
2021: {
'year': 2021,
'refIds': ['FL013', 'FL013'],
'duration': {
'FL013': [
{
startDate: '01-01-2021',
endDate: '11-01-2021'
},
{
startDate: '01-02-2021',
endDate: '28-02-2021',
}
]
}
}
},
{
2020: { year: 2020, 'refIds': ['FL013'], 'duration': { 'FL013': {
startDate: '03-05-2020',
endDate: '10-06-2020',
}
}
},
{
2019: { year: 2019, 'refIds': ['FL013'], 'duration': { 'FL013': {
startDate: '25-03-2019',
endDate: '25-04-2019',
}
}
}
我尝试使用JS reduce实现同样的功能,但是创建带有两个日期对象的年数组时,总是给我带来一个错误
这就是我迄今为止努力实现的目标:
const flatArray = primaryArray && primaryArray.reduce(
(acc, {startDate, endDate, refs}, currentIndex) => {
const year = refs && refs[0] && refs[0].year;
const refId = refs && refs[0] && refs[0].refId;
if (
year &&
refId &&
startDate &&
endDate &&
!Object.prototype.hasOwnProperty.call(acc, year)
) {
acc[year] = {
year,
refIds: [refId],
duration: {
[refId]: {
startDate,
endDate,
},
},
};
} else {
if (year) {
acc[year].refIds.push(refId);
acc[year]['duration'][refId] = {
startDate,
endDate,
};
}
}
return acc;
},{});
我使用两种方法修改了上面的代码,以获得准确的结果:首先,在accumlator中推送接收到的dates对象
acc[year]['duration'][refId].push({ startDate, endDate }).
这会引发错误:
未捕获类型错误:acc[year]。持续时间[refId]。推送不是函数
第二,我理解不适用的直接应用[]符号
以下是相同的工作链接:
非常感谢您为解决此问题提供的任何帮助。您可以使用Array.prototype.reduce执行类似操作: 常量主数组=[ { 起始日期:“01-01-2021”, 截止日期:“11-01-2021”, 参考文献:[ { 参考编号:FL013, 年份:2021年 } ] }, { 起始日期:“01-02-2021”, 截止日期:2021年2月28日, 参考文献:[ { 参考编号:FL013, 年份:2021年 } ] }, { 起始日期:“03-05-2020”, 截止日期:“10-06-2020”, 参考文献:[ { 参考编号:FL013, 年份:2020年 } ] }, { 起始日期:2019年3月25日, 截止日期:2019年4月25日, 参考文献:[ { 参考编号:FL013, 年份:2019年 } ] } ]; const res=primaryArray.reduceAc,{refs,startDate,endDate}=>{ if!acc[refs[0]。年份]{ 会计科目[参考文献[0]。年份]={ 年份:参考文献[0]。年份, refId:[refs[0]。refId], 持续时间:{ [参考文献[0]。refId]:{ 开始日期:开始日期, 结束日期:结束日期 } } } }否则{ acc[refs[0]。年份].refIds.pushrefs[0]。refId; acc[参考文献[0]。年份]。持续时间={ [参考文献[0]。refId]:[ {…acc[refs[0].year].duration[refs[0].refId]}, { 开始日期:开始日期, 结束日期:结束日期 } ] } } 返回acc; }, {}
console.logres 您可以使用Array.prototype.reduce执行以下操作: 常量主数组=[ { 起始日期:“01-01-2021”, 截止日期:“11-01-2021”, 参考文献:[ { 参考编号:FL013, 年份:2021年 } ] }, { 起始日期:“01-02-2021”, 截止日期:2021年2月28日, 参考文献:[ { 参考编号:FL013, 年份:2021年 } ] }, { 起始日期:“03-05-2020”, 截止日期:“10-06-2020”, 参考文献:[ { 参考编号:FL013, 年份:2020年 } ] }, { 起始日期:2019年3月25日, 截止日期:2019年4月25日, 参考文献:[ { 参考编号:FL013, 年份:2019年 } ] } ]; const res=primaryArray.reduceAc,{refs,startDate,endDate}=>{ if!acc[refs[0]。年份]{ 会计科目[参考文献[0]。年份]={ 年份:参考文献[0]。年份, refId:[refs[0]。refId], 持续时间:{ [参考文献[0]。refId]:{ 开始日期:开始日期, 结束日期:结束日期 } } } }否则{ acc[refs[0]。年份].refIds.pushrefs[0]。refId; acc[参考文献[0]。年份]。持续时间={ [参考文献[0]。refId]:[ {…acc[refs[0].year].duration[refs[0].refId]}, { 开始日期:开始日期, 结束日期:结束日期 } ] } } 返回acc; }, {}
console.logres 另一个选项是测试它是否已经是一个数组,如果不是,则创建它。 会计科目类型[年度]['期间][refId]!='[对象数组]'
另一个选项是测试它是否已经是一个数组,如果不是,则创建它。 会计科目类型[年度]['期间][refId]!='[对象数组]' 常量主数组=[{ 起始日期:“01-01-2021”, 截止日期:“11-01-2021”, 参考文献:[{ refId:'FL013', 年份:2021年, }, ], }, { 起始日期:“01-02-2021”, 截止日期:2021年2月28日, 参考文献:[{ refId:'FL013', 年份:2021年, }, ], }, { 起始日期:“03-05-2020”, 截止日期:“10-06-2020”, 参考文献:[{ refId:'FL013', 年份:“2020年”, }, ], }, { 起始日期:2019年3月25日, 截止日期:2019年4月25日, 参考文献:[{ refId:'FL013', 年份:2019年, }, ], }, ]; const result=primaryArray.reduceacc,cur=>{ 常数{ 开始日期, 结束日期, 参考文献:[{ refId, 年 }], }=cur; const entry=会计科目[年度]; const yearExistsAlready=条目!==未定义; 如果存在,请准备好{ entry.refIds.pushrefId; const duration=entry.duration[refId]; const durationExistsAlready=持续时间!==未定义; 如果DurationExistsAllready条目。duration[refId]。推送{ 开始日期, 实际结束 }; else条目。持续时间={ refId:{ 开始日期, 实际结束 } }; }否则{ 行政协调会[年度]={ 年 refId:[refId], 持续时间:{ [refId]:[{ 开始日期, 实际结束 }], }, }; } 返回acc; }, {}; 控制台。日志结果 常量主数组=[{ 起始日期:“01-01-2021”, 截止日期:“11-01-2021”, 参考文献:[{ refId:'FL013', 年份:2021年, }, ], }, { 起始日期:“01-02-2021”, 截止日期:2021年2月28日, 参考文献:[{ refId:'FL013', 年份:2021年, }, ], }, { 起始日期:“03-05-2020”, 截止日期:“10-06-2020”, 参考文献:[{ refId:'FL013', 年份:“2020年”, }, ], }, { 起始日期:2019年3月25日, 截止日期:2019年4月25日, 参考文献:[{ refId:'FL013', 年份:2019年, }, ], }, ]; const result=primaryArray.reduceacc,cur=>{ 常数{ 开始日期, 结束日期, 参考文献:[{ refId, 年 }], }=cur; const entry=会计科目[年度]; const yearExistsAlready=条目!==未定义; 如果存在,请准备好{ entry.refIds.pushrefId; const duration=entry.duration[refId]; const durationExistsAlready=持续时间!==未定义; 如果DurationExistsAllready条目。duration[refId]。推送{ 开始日期, 实际结束 }; else条目。持续时间={ refId:{ 开始日期, 实际结束 } }; }否则{ 行政协调会[年度]={ 年 refId:[refId], 持续时间:{ [refId]:[{ 开始日期, 实际结束 }], }, }; } 返回acc; }, {};
console.LogResulty您的播放代码链接没有任何代码。。。但是当我在我的机器上测试时,输出看起来很好,没有错误…@johntner这可以工作,但没有返回我需要的格式。我已经更新了我的工作代码链接你的游戏代码链接没有任何代码。。。但是当我在我的机器上测试时,输出看起来很好,没有错误…@johntner这可以工作,但没有返回我需要的格式。我已经更新了我的工作代码链接
const flatArray = primaryArray && primaryArray.reduce(
(acc, {startDate, endDate, refs}, currentIndex) => {
const year = refs && refs[0] && refs[0].year;
const refId = refs && refs[0] && refs[0].refId;
if (
year &&
refId &&
startDate &&
endDate &&
!Object.prototype.hasOwnProperty.call(acc, year)
) {
acc[year] = {
year,
refIds: [refId],
duration: {
[refId]: {
startDate,
endDate,
},
},
};
} else {
if (year) {
acc[year].refIds.push(refId);
if (acc[year]['duration'][refId] && typeof acc[year]['duration'][refId] !== '[object Array]') {
acc[year]['duration'][refId] = [acc[year]['duration'][refId]]
}
acc[year]['duration'][refId].push({
startDate,
endDate,
})
}
}
return acc;
},{});