检查变量,如果为假,则创建对象
Check for variable, if false, create object
我有一个带有时间值(以毫秒为单位)的嵌套数组。我想创建一个对象,以防数组没有该时间值的条目。现在我的代码是这样的:
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)});
现在,条件不起作用。有时,它会为已有对象的时间创建条目。
现在,您的代码正在使用嵌套循环,您将为已经具有 "time" 的对象创建条目。如果您以这种方式在 for 循环中使用 forEach
,这是预期的行为。
相反,我建议您创建一个包含所有 "times"...
的数组
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,
})
})
})
这是您在 中分享的那个小数组的演示:
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)
<script src="https://d3js.org/d3.v4.min.js"></script>
我有一个带有时间值(以毫秒为单位)的嵌套数组。我想创建一个对象,以防数组没有该时间值的条目。现在我的代码是这样的:
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)});
现在,条件不起作用。有时,它会为已有对象的时间创建条目。
现在,您的代码正在使用嵌套循环,您将为已经具有 "time" 的对象创建条目。如果您以这种方式在 for 循环中使用 forEach
,这是预期的行为。
相反,我建议您创建一个包含所有 "times"...
的数组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,
})
})
})
这是您在
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)
<script src="https://d3js.org/d3.v4.min.js"></script>