检查变量,如果为false,则创建对象

时间:2017-06-19 19:40:41

标签: javascript d3.js multidimensional-array conditional

我有一个带有时间值的嵌套数组(以毫秒为单位)。我想创建一个对象,以防数组没有该时间值的条目。现在我的代码是这样的:

var start = data[0].nDate;  // time in milliseconds
var end = data[data.length-1].nDate;  // time in milliseconds

var nestedData = d3.nest()
    .key(function (d){ return d.zone}) // id
    .key(function(d){return d.nDate})  // time in milliseconds
    .rollup(function(v){return {
        density: v[0].density,
        nDate: v[0].nDate,
        zone: v[0].zone,
        type: "zone"
    }})
    .sortKeys(d3.ascending)
    .sortValues(function(a,b){return a.date - b.date})
    .entries(data);

for (var i=start;i<end; i++){

    nestedData .forEach(function(b,j){
        var oneZone = +b.values[j].key; // time in milliseconds
        var o = {
            type: "nozone",
            zone: +b.key,  // id
            nDate: i,
            density: 0,
        };

        if(+(oneZone) != i){
            noZone.push(o)
        }
    })
}

//push calculations into a new array
nestedZones.forEach(function(d,i){
    var oneZone = d.values;
    for (var b=0; b<oneZone.length;b++){
        var timeZone = (oneZone[b].value);
        densityByZone.push(timeZone);
    }

});

noZone.forEach(function(d){densityByZone.push(d)});

现在,条件不起作用。有时,它会为已有对象的时间创建条目。

1 个答案:

答案 0 :(得分:1)

现在,您的代码正在使用嵌套循环,以便您为已经拥有该时间&#34;的对象创建条目。如果你在for循环中使用forEach,这就是预期的行为。

而不是那样,我建议你创建一个包含所有&#34;时代的数组&#34; ...

var nDateArray = d3.range(start, end + 1, 1);

...并使用这样的函数填充noZone

nestedData.forEach(function(e) {
    nDateArray.filter(function(f) {
        return e.values.map(function(g) {
            return +g.key
        }).indexOf(f) === -1;
    }).forEach(function(h) {
        noZone.push({
            type: "nozone",
            zone: +e.key, // id
            nDate: h,
            density: 0,
        })
    })
})

以下是您在your comment中分享的小数组的演示:

&#13;
&#13;
var data = [{
  date: "Sun Mar 26 2017 16:30:00",
  density: 0.04,
  nDate: 1656178,
  surface: 8000,
  zone: 99
}, {
  date: "Sun Mar 26 2017 17:00:00",
  density: 0.02,
  nDate: 1656180,
  surface: 2550,
  zone: 99
}];

var noZone = [];
var start = data[0].nDate; // time in milliseconds
var end = data[data.length - 1].nDate; // time in milliseconds
var nDateArray = d3.range(start, end + 1, 1);

var nestedData = d3.nest()
  .key(function(d) {
    return d.zone
  }) // id
  .key(function(d) {
    return d.nDate
  }) // time in milliseconds
  .rollup(function(v) {
    return {
      density: v[0].density,
      nDate: v[0].nDate,
      zone: v[0].zone,
      type: "zone"
    }
  })
  .sortKeys(d3.ascending)
  .sortValues(function(a, b) {
    return a.date - b.date
  })
  .entries(data);

nestedData.forEach(function(e) {
  nDateArray.filter(function(f) {
    return e.values.map(function(g) {
      return +g.key
    }).indexOf(f) === -1;
  }).forEach(function(h) {
    noZone.push({
      type: "nozone",
      zone: +e.key, // id
      nDate: h,
      density: 0,
    })
  })
})

console.log(noZone)
&#13;
<script src="https://d3js.org/d3.v4.min.js"></script>
&#13;
&#13;
&#13;