D3:如何检测 .each() 的结束

D3: How to detect the end of the .each()

在 D3.js 中,我使用以下方法遍历数据:

elem.allDataRows.each(function(d, i) {
    elem.checkboxMemory[i] = {
        id: d.key,
        isChecked: d.isChecked
    };
});

由于这个过程是异步的,我需要能够确定循环过程何时完成。

他们在 D3 中有什么方法可以让我检测到 .each() 的结尾吗?不是针对每个间隔,而是针对整个过程。

郑重声明,elem.allDataRows是一个数组。

谢谢!

一种简单的方法是检查索引的值 i:

function(d, i) {
    if (i == elem.allDataRows.length - 1){
        // last element
    }
    elem.checkboxMemory[i] = {
        id: d.key,
        isChecked: d.isChecked
    };
}

each是同步的。

d3.selectAll('div').each(function() {
 log(d3.select(this).text()); 
});

log('done');

function log(text) {
   var d = document.createElement('pre');
    d.innerHTML = 'log: ' + text;
   document.getElementById('output').appendChild(d);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<div>1</div>
<div>2</div>

<output id="output"></output>

首先我会说 .each 实际上是 同步 。因此,如果您只想在代码完成后执行代码,那么您可以在 .each 调用后的行中执行此操作。

如果您试图在 .each 循环中识别集合中的最后一项以便应用特殊逻辑,那么您需要将当前索引与 jquery 的长度进行比较目的。请参阅下面的示例。

var lastIndex = elem.allDataRows.length - 1;
elem.allDataRows.each(function(d, i) {
    if (i == lastIndex) {
        // Do something cool here!
    }

    elem.checkboxMemory[i] = {
        id: d.key,
        isChecked: d.isChecked
    };
});