为什么我的JS array.forEach()函数具有异步行为?

时间:2019-06-12 21:56:13

标签: javascript

我已经在vuex商店中实现了一个似乎很简单的JavaScript函数,但是该函数似乎是异步的。在Chrome中使用console.log()可以得到完整的数组,但是尝试console.log(JSON.parse(JSON.stringify(array)))可以得到一个空数组。据我所知,这表明我代码的某些部分是异步运行的,我真的很想弄清楚如何将此行为更改为同步。

我的代码:

function groupBy(array, key){
    let list = [];
    array.forEach(element =>{
        if(!list[element[key]]){
            list[element[key]] = [element];
        }else{
            list[element[key]].push(element);
        }
    });
    return list;
}

我正在测试输出:

    let list = groupBy(items, 'grpstr');
    console.log(JSON.parse(JSON.stringify(list)));
    console.log(list);
    return list;

同样,在chrome控制台中,第一个log()返回一个空数组,而第二个返回正确的数组。我这是怎么了?

我尝试将累积的数组更改为一个对象,该对象可以(奇怪地)工作,但是我需要将此数组传递到vuejs应用中以进行迭代,而vue不会以有用的方式迭代对象键(至少对于我的应用而言)。

编辑: 传递给函数的数据是以下形式的对象数组:

[{grpstr: "01-31-2017" ...}, {grpstr: "01-31-2017" ...}, {grpstr: "01-31-2017" ...} ]

1 个答案:

答案 0 :(得分:0)

这与异步无关。不要将数组用作对象。序列化数组时,所有非数字属性都将被删除,这就是为什么它们不在您的第一个日志中出现的原因。通常,数组是与数字键一起使用的,因此在这里对象是一个更好的选择(因为您的键是非数字的)。