【问题标题】:How to slice a three dimensional array in three for in loops?如何将一个三维数组分成三个 for in 循环?
【发布时间】:2018-10-02 22:10:07
【问题描述】:

我正在尝试创建一个像这样的三维数组:

        let insPerDay = []
        let insDuringThisWeek = [];
        let  insDuringThisWeek_temp = [[], [], [], [], [], [], []]; 
        for (var i = 0; i < spaceIterationInsWeek.length; i++){
            // this loop will repeat a variable amount of times but in this example it repeats twice   
            for (let k=0; k<weekArray.length; k++) {
            // will repeat a variable amount of times but in this example it repeats 7 times    
                for (let j = 0; j < spaceIterationInsWeek[i].length; j ++) {
                // will repeat a variable amount of time (I think in this case it's 167 times, 104 the first loop, 63 the second);
                    if (spaceIterationInsWeek[i][j] > weekArray[k][0] && spaceIterationInsWeek[i][j] < weekArray[k][1]) {
                        insDuringThisWeek_temp[k].push(spaceIterationInsWeek[i][j]);    
                    }   
                } 
                insDuringThisWeek.push(insDuringThisWeek_temp[k]);                                     
            }     

             console.log(insDuringThisWeek.slice()); 
            insPerDay.push(insDuringThisWeek.slice());
            console.log(insPerDay);                
        // insDuringThisWeek.push(insDuringThisWeek_temp);                            
        }  

现在我控制台正在记录这个:

请注意,第一次运行子循环时,insDuringThisWeek.slice() 正在记录 Array(28),但在内部,当我展开视图时,它实际上是 36 而不是 28。我知道这与数组通过引用传递的事实有关,这就是我尝试使用 slice() 来防止这种情况的原因。

最终预期的结果应该是: 1 个父数组,带有 2 个子数组,每个子数组带有 7 个孙子数组。那么那些 7 个孙子数组应该有不同的长度...

类似:

(2) [Array(7), Array(7)]
    > 0: (7) [Array(28), Array(12), Array(8), Array(0), Array(0), Array(50), Array(6)]
    > 1: (7) [Array(8), Array(11), Array(3), Array(0), Array(0), Array(37), Array(4)]

现在数组加起来是这样的:

(2) [Array(7), Array(14)]
    > 0: (7) [Array(36), Array(23), Array(11), Array(0), Array(0), Array(87), Array(10)]
    > 1: (14) [Array(36), Array(23), Array(11), Array(0), Array(0), Array(87), Array(10), Array(36), Array(23), Array(11), Array(0), Array(0), Array(87), Array(10)]

有没有办法使用三循环逻辑来实现这一点?

spaceIterationInsWeek的“复制/粘贴”数据:

  var spaceIterationInsWeek = [["1538032574112", "1538032574299", "1538032574489", "1538032574707", "1538032574958", "1538032580589", "1538032580744", "1538032583050", "1538035431634", "1538035432105", "1538044237902", "1538044253095", "1538089207793", "1538089207972", "1538089208184", "1538089209765", "1538089209935", "1538089210172", "1538140319898", "1538140320415", "1538393131974", "1538393132133", "1538393132301", "1538393134682", "1538419054736", "1538419056057", "1538419056445", "1538421078992", "1538423320582", "1538423324199", "1538423328179", "1538423331484", "1538423472877", "1538423584874", "1538423586801", "1538423604206", "1538423664249", "1538423668981", "1538423682914", "1538423691802", "1538423866031", "1538423867420", "1538423868327", "1538423875373", "1538424176251", "1538424179511", "1538424231217", "1538424283692", "1538424327861", "1538424327866", "1538424327868", "1538424327871", "1538424327877", "1538424327882", "1538424327884", "1538424327891", "1538424327896", "1538426250753", "1538426251268", "1538426251642", "1538428174561", "1538428174925", "1538428175168", "1538428179449", "1538428179612", "1538428185771", "1538428199625", "1538428204510", "1538428204700", "1538428204883", "1538497882619", "1538498290347", "1538498319612", "1538498370580", "1538498465625", "1538498510231"],["1538033851202", "1538035355166", "1538035355949", "1538035370713", "1538043037913", "1538043065714", "1538043065993", "1538043530533", "1538043531900", "1538043533828", "1538044225832", "1538089267124", "1538089267318", "1538089267543", "1538393117968", "1538393118102", "1538393118254", "1538393119966", "1538393120110", "1538393120362", "1538393120538", "1538393120722", "1538414187921", "1538414188175", "1538414188327", "1538414191291", "1538414191516", "1538424651376", "1538424672070", "1538424672073", "1538424672077", "1538424672080", "1538424673236", "1538424673238", "1538424673241", "1538424673244", "1538424679001", "1538424679010", "1538424679014", "1538424679017", "1538428236679", "1538428236846", "1538428237012", "1538428237172", "1538428237341", "1538428237491", "1538428237649", "1538428237816", "1538428237982", "1538428238159", "1538428238334", "1538498266744", "1538498341583", "1538498481082", "1538498494065"]]

weekArray 的“复制/粘贴”数据:

   var weekArray = [[1538002800000, 1538089200000], [1538089200000, 1538175600000],[1538175600000, 1538262000000], [1538262000000, 1538348400000],[1538348400000, 1538434800000],[1538434800000, 1538521200000],[1538521200000, 1538607600000]]

【问题讨论】:

  • 我们能否获得一些spaceIterationInsWeekweekArray 的可复制粘贴样本数据?
  • @mpen 我已经把它放在问题中了。
  • 那些不是可复制粘贴的。将其粘贴到 Chrome 开发工具/控制台中,您将收到 JS 语法错误。
  • 如果需要,您可以使用JSON.stringify(data) 获得不错的输出。我们不需要全部,只需要使用即可。
  • 谢谢。现在我只是想了解您要做什么...weekArray 似乎是一组每天的开始/结束对(相隔 24 小时)。然后spaceIterationInsWeek 是……什么?你想做什么?查找每天范围内的时间戳? spaceIterationInsWeek 中的两个子数组是什么?

标签: javascript arrays for-loop multidimensional-array


【解决方案1】:

这是另一种方法......可能是也可能不是您正在寻找的确切输出。

var spaceIterationInsWeek = [
  ["1538032574112", "1538032574299", "1538032574489", "1538032574707", "1538032574958", "1538032580589", "1538032580744", "1538032583050", "1538035431634", "1538035432105", "1538044237902", "1538044253095", "1538089207793", "1538089207972", "1538089208184", "1538089209765", "1538089209935", "1538089210172", "1538140319898", "1538140320415", "1538393131974", "1538393132133", "1538393132301", "1538393134682", "1538419054736", "1538419056057", "1538419056445", "1538421078992", "1538423320582", "1538423324199", "1538423328179", "1538423331484", "1538423472877", "1538423584874", "1538423586801", "1538423604206", "1538423664249", "1538423668981", "1538423682914", "1538423691802", "1538423866031", "1538423867420", "1538423868327", "1538423875373", "1538424176251", "1538424179511", "1538424231217", "1538424283692", "1538424327861", "1538424327866", "1538424327868", "1538424327871", "1538424327877", "1538424327882", "1538424327884", "1538424327891", "1538424327896", "1538426250753", "1538426251268", "1538426251642", "1538428174561", "1538428174925", "1538428175168", "1538428179449", "1538428179612", "1538428185771", "1538428199625", "1538428204510", "1538428204700", "1538428204883", "1538497882619", "1538498290347", "1538498319612", "1538498370580", "1538498465625", "1538498510231"],
  ["1538033851202", "1538035355166", "1538035355949", "1538035370713", "1538043037913", "1538043065714", "1538043065993", "1538043530533", "1538043531900", "1538043533828", "1538044225832", "1538089267124", "1538089267318", "1538089267543", "1538393117968", "1538393118102", "1538393118254", "1538393119966", "1538393120110", "1538393120362", "1538393120538", "1538393120722", "1538414187921", "1538414188175", "1538414188327", "1538414191291", "1538414191516", "1538424651376", "1538424672070", "1538424672073", "1538424672077", "1538424672080", "1538424673236", "1538424673238", "1538424673241", "1538424673244", "1538424679001", "1538424679010", "1538424679014", "1538424679017", "1538428236679", "1538428236846", "1538428237012", "1538428237172", "1538428237341", "1538428237491", "1538428237649", "1538428237816", "1538428237982", "1538428238159", "1538428238334", "1538498266744", "1538498341583", "1538498481082", "1538498494065"]
]

var weekArray = [
  [1538002800000, 1538089200000],
  [1538089200000, 1538175600000],
  [1538175600000, 1538262000000],
  [1538262000000, 1538348400000],
  [1538348400000, 1538434800000],
  [1538434800000, 1538521200000],
  [1538521200000, 1538607600000]
]


var out = spaceIterationInsWeek.map(space => {
  let grouped = Array.from({
    length: weekArray.length
  }).map(_ => []); // create an empty array for each week pair
  
  space.forEach(ts => {
    let idx = weekArray.findIndex(([start, end]) => ts >= start && ts < end); // find which day the space falls into
    if (idx >= 0) {
      grouped[idx].push(ts); // group it using the week-pair's index
    } else {
      console.error(`Timestamp ${ts} not found in any week array`) // if no time range found, error!
    }
  })
  return grouped;
})

console.log(out);

【讨论】:

  • 我会尽快尝试一下,以便标记为正确。非常感谢@mpen。
【解决方案2】:

只需要在最后清空数组即可:

        let insPerDay = []
        let insDuringThisWeek = [];
        let  insDuringThisWeek_temp = [[], [], [], [], [], [], []]; // clean array
        for (var i = 0; i < spaceIterationInsWeek.length; i++){
            // will repeat the number of depts (i =2)  

            for (let k=0; k<weekArray.length; k++) {
            // will repeat 7 times  (j =7)   
                for (let j = 0; j < spaceIterationInsWeek[i].length; j ++) {
                // will repeat the number of ins
                    if (spaceIterationInsWeek[i][j] > weekArray[k][0] && spaceIterationInsWeek[i][j] < weekArray[k][1]) {
                        insDuringThisWeek_temp[k].push(spaceIterationInsWeek[i][j]);    
                    }   

                } 
                insDuringThisWeek.push(insDuringThisWeek_temp[k].slice());   
                console.log(insDuringThisWeek);             

            }     
            insPerDay.push(insDuringThisWeek);
        //HERE
            insDuringThisWeek = [];
            insDuringThisWeek_temp = [[], [], [], [], [], [], []];
            console.log(insPerDay);


        }   

【讨论】:

    猜你喜欢
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    相关资源
    最近更新 更多