Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在不创建新条目的情况下将值推入子数组_Javascript_Arrays_Typescript_Multidimensional Array - Fatal编程技术网

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})
-否则您无法获得每个唯一日期第一次出现的金额