Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript json对象中基于同一数组中其他对象内容的默认值_Javascript_Jquery_D3.js_Nvd3.js - Fatal编程技术网

Javascript json对象中基于同一数组中其他对象内容的默认值

Javascript json对象中基于同一数组中其他对象内容的默认值,javascript,jquery,d3.js,nvd3.js,Javascript,Jquery,D3.js,Nvd3.js,我现在很迷茫,已经为此工作了大约6天,所以请原谅我,如果这有点让人困惑的话。我使用NVD3显示一些基于BigQuery中数据的图形。所有输入的数据都是正确的,图形实现也是正确的,问题是实际的JSON数据。多条形图要求每个“集合”数据在初始数组下具有相同的日期和相同的值数。根据我的数据,如果用户当天没有记录事件或其他内容,有时会丢失值 我在这里尝试做的基本思想是循环初始json并附加“缺失”值。例如,这将是我从BigQuery和API中获得的初始数据: [ "t1":{ "target

我现在很迷茫,已经为此工作了大约6天,所以请原谅我,如果这有点让人困惑的话。我使用NVD3显示一些基于BigQuery中数据的图形。所有输入的数据都是正确的,图形实现也是正确的,问题是实际的JSON数据。多条形图要求每个“集合”数据在初始数组下具有相同的日期和相同的值数。根据我的数据,如果用户当天没有记录事件或其他内容,有时会丢失值

我在这里尝试做的基本思想是循环初始json并附加“缺失”值。例如,这将是我从BigQuery和API中获得的初始数据:

[
  "t1":{
    "target": "t1",
    "datapoints": [
      [
        16.0,
        1483747200.0
      ],
      [
        10.0,
        1484352000.0
      ]
    ]
  },
  "t2":{
    "target": "t2",
    "datapoints": [
      [
        10.0,
        1483660800.0
      ],
      [
        19.0,
        1484006400.0
      ],
      [
        10.0,
        1484956800.0
      ]
    ]
  }
]
您可以在这里看到,第一个对象有一个带有2个值的datapoints数组,第二个对象有一个带有3个值的datapoints数组。datapoints数组的1索引包含一个UNIX日期,整个对象中的每个datapoints数组都必须有一个带有日期的数组,然后0作为默认值。所以格式化的数据看起来像这样:

[
  "t1":{
    "target": "t1",
    "datapoints": [
      [
        16.0,
        1483747200.0
      ],
      [
        10.0,
        1484352000.0
      ],
      [
        0.0,
        1483660800.0
      ],
      [
        0.0,
        1484006400.0
      ],
      [
        0.0,
        1484956800.0
      ]
    ]
  },
  "t2":{
    "target": "t2",
    "datapoints": [
      [
        10.0,
        1483660800.0
      ],
      [
        19.0,
        1484006400.0
      ],
      [
        10.0,
        1484956800.0
      ],
      [
        0.0,
        1483747200.0
      ],
      [
        0.0,
        1484352000.0
      ]
    ]
  }
]
我真的不知道从这里到哪里去,任何帮助都会非常有用。我已经在这方面工作了好几天了,现在我只是在磨齿轮。谢谢

基本上,在一个数组中找到但在其他数组中找不到的每个值都应使用时间戳,但应将第一个值/索引设置为0


我还应该提到,查询只查询了30天以前的数据,因此最多每个datapoints数组都有30个数组

下面是一个快速而肮脏的解决方案。请注意,我在您提供的示例中添加了一个附加条目,以便两个数据对象都包含一个具有公共日期的数据点

var orig= [
  {
    "target": "t1",
    "datapoints": [
      [
        16.0,
        1483747200.0
      ],
      [
        10.0,
        1484352000.0
      ],
      [
        10.0,
        1483660800.0
      ]
    ]
  },
  {
    "target": "t2",
    "datapoints": [
      [
        10.0,
        1483660800.0
      ],
      [
        19.0,
        1484006400.0
      ],
      [
        10.0,
        1484956800.0
      ]
    ]
  }
];
console.log('Original Data', JSON.stringify(orig));

// Get a list of all the datapoint dates
var dates = [];
orig.forEach(function(item) {
  item.datapoints.forEach(function(dp) {
    var date = dp[1];
    dates.push(date);
  })
});
console.log('All Dates', JSON.stringify(dates));

// Remove duplicates from array
dates = dates.filter(function (el, i, arr) {
    return arr.indexOf(el) === i;
});
console.log('Unique Dates', JSON.stringify(dates));

// Check each item in the original array for records for each date and add a
// 0 value entry if the date entry is missing
dates.forEach(function(dt) {
  orig.forEach(function(item, itemIndex) {
    var hasEntry = false;

    item.datapoints.forEach(function(dp) {
      if (dp[1] === dt) hasEntry = true;
    });

    if (!hasEntry) {
      item.datapoints.push([0, dt]);
    }
  });
});

console.log('Updated Data', JSON.stringify(orig));

这里是相应的plunker,因此您可以看到它的作用:

下面是一个快速而肮脏的解决方案。请注意,我在您提供的示例中添加了一个附加条目,以便两个数据对象都包含一个具有公共日期的数据点

var orig= [
  {
    "target": "t1",
    "datapoints": [
      [
        16.0,
        1483747200.0
      ],
      [
        10.0,
        1484352000.0
      ],
      [
        10.0,
        1483660800.0
      ]
    ]
  },
  {
    "target": "t2",
    "datapoints": [
      [
        10.0,
        1483660800.0
      ],
      [
        19.0,
        1484006400.0
      ],
      [
        10.0,
        1484956800.0
      ]
    ]
  }
];
console.log('Original Data', JSON.stringify(orig));

// Get a list of all the datapoint dates
var dates = [];
orig.forEach(function(item) {
  item.datapoints.forEach(function(dp) {
    var date = dp[1];
    dates.push(date);
  })
});
console.log('All Dates', JSON.stringify(dates));

// Remove duplicates from array
dates = dates.filter(function (el, i, arr) {
    return arr.indexOf(el) === i;
});
console.log('Unique Dates', JSON.stringify(dates));

// Check each item in the original array for records for each date and add a
// 0 value entry if the date entry is missing
dates.forEach(function(dt) {
  orig.forEach(function(item, itemIndex) {
    var hasEntry = false;

    item.datapoints.forEach(function(dp) {
      if (dp[1] === dt) hasEntry = true;
    });

    if (!hasEntry) {
      item.datapoints.push([0, dt]);
    }
  });
});

console.log('Updated Data', JSON.stringify(orig));

这里是相应的Plunk,因此您可以看到它的实际作用:

您必须先进行一些数据处理,以获得所有日期,然后只需填写每个日期的实际数据即可

const json=[
{
“目标”:“t1”,
“数据点”:[
[
16.0,
1483747200
],
[
10.0,
1484352000
]
]
},
{
“目标”:“t2”,
“数据点”:[
[
10.0,
1483660800
],
[
19.0,
1484006400
],
[
10.0,
1484956800
]
]
}
]
//使用es6集
const dates=新集合()
forEach(x=>x.datapoints.map(dp=>dates.add(dp[1]))
//所有的日期都有
dates.forEach(d=>console.log(d))
常数fillDp=dp=>{
返回数组.from(dates).sort().map(d=>dp.find(x=>x[1]==d)|[0,d])
}
const result=json.map(x=>Object.assign(x,{datapoints:fillDp(x.datapoints)}))

console.log(JSON.stringify(result[0].datapoints))
首先需要进行一些数据处理,以获取所有日期,然后只需填写每个日期的实际数据即可

const json=[
{
“目标”:“t1”,
“数据点”:[
[
16.0,
1483747200
],
[
10.0,
1484352000
]
]
},
{
“目标”:“t2”,
“数据点”:[
[
10.0,
1483660800
],
[
19.0,
1484006400
],
[
10.0,
1484956800
]
]
}
]
//使用es6集
const dates=新集合()
forEach(x=>x.datapoints.map(dp=>dates.add(dp[1]))
//所有的日期都有
dates.forEach(d=>console.log(d))
常数fillDp=dp=>{
返回数组.from(dates).sort().map(d=>dp.find(x=>x[1]==d)|[0,d])
}
const result=json.map(x=>Object.assign(x,{datapoints:fillDp(x.datapoints)}))

console.log(JSON.stringify(result[0].datapoints))
如果您熟悉基本的JavaScript循环和日期对象,那么这很简单。你有没有试过在MDN或教程中查看这些内容?我到处都看过,我认为这更像是一个逻辑问题,而不是实际的代码问题。我并不擅长使用javascript来完成这类任务。我知道我必须循环遍历每个数组,但对于如何处理这些值,我不确定。通常,我会离开这几天,回来解决它,但我真的没有选择。。。截止日期。时间限制是以毫秒(精确)还是以天为单位?使用bigquery,日期/时间从
UNIX\u秒开始。时间戳设置为当天上午12点,因此它们就是当天。因此,有两个起始数组,t1和t2,需要两个结果数组,它们都是这两个数组的并集,如果t2不存在,则t1[0]=0,如果t1不存在,则t2[0]=0。array concat创建结果数组,然后迭代结果数组并从源数组中查找值,如果找不到,则替换为零。如果您熟悉基本的JavaScript循环和日期对象,这很简单。你有没有试过在MDN或教程中查看这些内容?我到处都看过,我认为这更像是一个逻辑问题,而不是实际的代码问题。我并不擅长使用javascript来完成这类任务。我知道我必须循环遍历每个数组,但对于如何处理这些值,我不确定。通常,我会离开这几天,回来解决它,但我真的没有选择。。。截止日期。时间限制是以毫秒(精确)还是以天为单位?使用bigquery,日期/时间从
UNIX\u秒开始。时间戳设置为当天上午12点,因此它们就是当天的时间。因此,有两个起始数组t1和t2,需要两个结果数组,它们都是这两个数组的并集,如果ab为t1[0]=0