Javascript 如何在不创建新条目的情况下将值推入子数组
我有两个阵列:Javascript 如何在不创建新条目的情况下将值推入子数组,javascript,arrays,typescript,multidimensional-array,Javascript,Arrays,Typescript,Multidimensional Array,我有两个阵列: resultList: { date: string, amount: number }[] = []; dateList: { date: string, amounts: { amount: number }[] }[] = []; 其中一个包含所有结果,我想按日期排序,因此是第二个数组。 这是我用来实现这一目标的代码: this.resultList.forEach((result) => { let dateFound: boolean = false
resultList: { date: string, amount: number }[] = [];
dateList: { date: string, amounts: { amount: number }[] }[] = [];
其中一个包含所有结果,我想按日期排序,因此是第二个数组。
这是我用来实现这一目标的代码:
this.resultList.forEach((result) => {
let dateFound: boolean = false;
this.dateList.forEach((date) => {
if (result.date === date.date) {
dateFound = true;
return;
}
});
if (dateFound == false) {
//create new date entry in dateList
this.dateList.push({date: result.date, amounts: []});
}
//find that date entry and push a value to it's sub array called amounts
this.dateList.find((dates) => {
return dates.date == result.date
}).amounts.push({
amount: result.amount
});
});
如果有3个相同日期的结果,则输出
[
{date: '2018-03-21', amounts: [{amount: 1}]},
{date: '2018-03-21', amounts: [{amount: 1},{amount: 43}]},
{date: '2018-03-21', amounts: [{amount: 1},{amount: 43}, {amount: 55}]}
]
[
{date: '2018-03-21', amounts: [{amount: 1},{amount: 43}, {amount: 55}]}
]
如果有3个相同日期的结果,则需要输出
[
{date: '2018-03-21', amounts: [{amount: 1}]},
{date: '2018-03-21', amounts: [{amount: 1},{amount: 43}]},
{date: '2018-03-21', amounts: [{amount: 1},{amount: 43}, {amount: 55}]}
]
[
{date: '2018-03-21', amounts: [{amount: 1},{amount: 43}, {amount: 55}]}
]
我在if条件中添加了一个
else
子句,并删除了.find()
部分:
if (dateFound == false) {
//create new date entry in dateList
this.dateList.push({date: result.date, amounts: []});
} else {
for (let d of this.dateList) {
if (d.date == result.date) {
d.amounts.push({amount: result.amount})
}
}
}
您可以这样做:首先将数据放入一个对象中,以唯一的日期作为键,数量作为每个键的值,然后将其放入所需输出的结构中,如下所示:
var数据=[
{日期:'2018-03-21',金额:1},
{日期:'2018-03-21',金额:43},
{日期:'2018-03-21',金额:41},
{日期:'2018-03-22',金额:18},
{日期:'2018-03-23',金额:25},
{日期:'2018-03-24',金额:15},
{日期:'2018-03-24',金额:25},
];
//简化为单个对象,以唯一日期作为键,以金额集合作为值
var dateMap=data.reduce((res,curr)=>{
//如果尚未添加日期
如果(!res[当前日期]){
//在结果对象上创建它
资源[当前日期]=[]
}
//将金额推送到日期的数组中
res[curr.date].push({amount:curr.amount});
返回res;
}, {});
//将dateMap的每个键映射到与所需输出格式匹配的对象
var dateList=Object.keys(dateMap.map)(key=>{
返回{date:key,amounts:dateMap[key]};
});
console.log(日期列表)代码>您可以将数组转换为一个数组。对于每个日期,使用amounts
属性创建一个对象,并用同一日期的amount值填充该对象。然后返回到一个数组:
const data=[{“日期”:“2018-03-21”,“金额”:1},{“日期”:“2018-03-21”,“金额”:43},{“日期”:“2018-03-21”,“金额”:41},{“日期”:“2018-03-22”,“金额”:18},{“日期”:“2018-03-23”,“金额”:25},{“日期”:“2018-03-24”,“金额”:15},{“日期”:“2018-03-24”,“金额”:25};
常量结果=[…数据
.减少((r,o)=>{
const{date,amount}=o;
r、 has(date)| | r.set(date,{
日期,
金额:[]
});
r、 get(date).amounts.push({amount});
返回r;
},新映射())
.values()
];
控制台日志(结果)
您可以发布有效的输入数据吗?如果使用lodash,则u.groupBy else使用lodash
@georg hehehe yes或yes!对我来说,这段代码似乎有效…@H.B.这是一件奇怪的事情,我从另一个项目复制了这段代码,在那里我做了同样的事情,它在那里工作。所以我想我可能做错了什么,或者find不是那样工作的,或者其他什么。工作非常整洁,谢谢!你知道为什么我的方法不起作用吗?我现在觉得自己很愚蠢。这将是我在这类东西上的第一个方法,但是javascript真的把我甩了。很高兴听到你的问题解决了:)发生在我们所有人身上这保持了原始的O(n^2)
时间复杂度,我想应该是This.dateList.push({date:result.date,amounts:result.amount})
-否则您无法获得每个唯一日期第一次出现的金额