循环/ Foreach槽JS 2级数组

问题描述

我正在建立工作清单,但是..客户要我
按“位置”对工作进行分组-所以我收集了项目
按位置分组(我的格式可能不正确)
并尝试将其附加回去,以使forEach无法正常工作。

alljobs     = [];
counter     = 1;
departments = {};
var apiurl  = "https://www.comeet.co/careers-api/2.0/company/UID_KEY_HERE/positions/?token=TOKEN_KEY_HERE&details=true";

fetch(apiurl)
    .then(res => res.json())
    .then((out) => {

        $.each(out,function() {
            // console.log(this);

            if(this.department && this.location.name) {

                !(this.location.name in alljobs) ? alljobs[this.location.name] = [] : '';

                alljobs[this.location.name][counter] =  
                '<div class="job-item '+this.uid+' '+string_to_slug(this.department)+'">'
                    +'<div class="row" data-jobid="'+this.uid+'">'
                        +'<div class="col-md-4 item-title"><a href="<?PHP echo get_permalink($comeet['positions_page']); ?>?jobid='+this.uid+'">'+ this.name +'</a></div>'
                        +'<div class="col-md-2 expertise">'+ this.location.name +'</div>'
                        +'<div class="col-md-3 expertise">'+ this.department +'</div>'
                        +'<div class="col-md-3 job-link"> <a href="<?PHP echo get_permalink($comeet['positions_page']); ?>?jobid='+this.uid+'" class="btn btn-info gotoPosition" data-jobid="'+this.uid+'"><?PHP _e("Details",THEME_NAME); ?></a> </div>'
                    +'</div>'
                +'</div>';

                departments[this.department] = '<li class="jobsPicker" data-show="'+string_to_slug(this.department)+'">'+this.department+'</li>';

                counter++;
            }

        });

    })
    .catch(err => { throw err }); 


    
    /********************************************************
    **  APPEND ALL JOBS
    ********************************************************/
    if(alljobs) {
        console.log(alljobs.length);        // RETURNS 0 <--- WHY?!
        console.log(alljobs);

        alljobs.forEach(function(params) {  // DOESNT RUN
            console.log(params);          
        })
    }

解决方法

我认为您的问题是,您将alljobs初始化为一个数组,但是当您为其分配作业位置时,您会将其视为对象或关联数组。

如果将数据存储为对象,则只能使用类似的键名来创建某种模拟关联数组。 Javascript不支持关联数组。您正在尝试使用仅在使用标准的索引JS数组时才有效的数组方法(forEach())。如果需要命名键,请使用一个对象,也称为“哈希”。

您最好的选择是将其初始化为对象并使用Object.keys()进行遍历,或者使用alljobs[i]为其分配位置(仅以i为例一种数字计数器)。

当您检查数组的length属性时,它正在寻找索引,因此alljobs[0]等等。由于您正在将索引分配为属性名称,即alljobs[this.location.name][counter],因此您的数组技术上没有长度。

[编辑]

像在代码的前几行中那样初始化未声明的变量并不是真正的最佳实践,最好的选择是分配诸如varlet或{{ 1}}。目前,您只是在污染全球空间,几乎从来不建议这样做。