我有一个遍历数据数组 plotData
的循环。在 plotData
之外,我构建了另一个名为 visiblePoints
的数组。然后我遍历 visiblePoints
来构建一个对象 thisRow
,然后我将 thisRow
添加到循环外的一个数组,称为 dataArray
:
var dataArray = []
for (i = 0; i < plotData.length; i++) {
// This filters datapoints array into another array
var visiblePoints = filterPoints(plotData[i].datapoints)
// Get the string for the thisRow object key name
var selectedParameter = plotData[i].label
for (k = 0; k < visiblePoints.length; k++) {
// Convert visiblePoint first value from ms to date
var timestamp = new Date(visiblePoints[k][0])
// Form the thisRow object that will go into dataArray
// for each loop of visiblePoints
var thisRow = {}
thisRow["Time"] = msToTime(timestamp)
thisRow[selectedParameter] = visiblePoints[k][1]
dataArray.push(thisRow)
}
}
让我们简化一下,对于每个 plotData
数组,我在子数组 visisblePoints
中只有 2 个元素,像这样(每个 plotData
数组可以有许多 visiblePoints
但我简化为每个只有 2 个):
plotData[0].visiblePoints = [[00:00:01, 1], [00:00:02, 4] ...]
plotData[1].visiblePoints = [[00:00:01, 27], [00:00:02, 31] ...]
plotData
在控制台上看起来像这样:
k
循环的 visiblePoints
数组派生自 plotData.datapoints
,如下所示:
其中 visiblePoints[n][0]
是以毫秒为单位的值(我将其转换为秒)而 visiblePoints[n][1]
只是一个浮点值.
visiblePoints =
[0, 0.0500466109191]
[100, 0.0548114598135]
[200, 0.0550143573252]
[300, 0.0549408536766]
[400, 0.0546117305419]
[... repeat 300+ times...]
在遍历 plotData[i]
和 visiblePoints[k]
之后,我得到:
dataArray = [
{
"Time": 00:00:01,
"foo": 1
},
{
"Time": 00:00:01,
"bar": 27
},
{
"Time": 00:00:02,
"foo": 4
},
{
"Time": 00:00:02,
"bar": 31
},
]
当我打算结束时:
dataArray = [
{
"Time": 00:00:01,
"foo": 1,
"bar": 27
},
{
"Time": 00:00:02,
"foo": 4,
"bar": 31
}
]
我认为在循环 k
中我需要遍历 dataArray
,检查那里的所有对象以查看是否有匹配的 Time
键thisRow["Time"] = msToTime(timestamp)
,如果是,则添加 thisRow[selectedParameter] = visiblePoints[k][1]
,如果不是,则创建一个新对象。
问题:
- 我不确定如何在 JS 中检查这个(我在 Python 方面更有经验,但在这方面没那么多
- 我好像做了很多循环。我不确定添加另一个对象来遍历整个
dataArray
并检查所有对象以查看其中一个对象中是否存在键是此处的最佳解决方案。plotData.visiblePoints
数组的长度可以超过 500。
[编辑] 简化了问题。添加了图片示例。添加了 k
数组的文本示例。
最佳答案
您可以构建一个以分组为键的对象——在本例中为时间戳。这将使您无需搜索数组即可随机访问所需的项目。完成后,对象的 Object.values
将成为分组对象的数组:
let plotData = [
{
label: 'foo',
visiblePoints: [[`00:00:01`, 1], [`00:00:02`, 4]]
},
{
label: 'bar',
visiblePoints: [[`00:00:01`, 27], [`00:00:02`, 31]]
}
]
let groups = plotData.reduce((obj, {label, visiblePoints}) => {
visiblePoints.forEach(([time, val]) => {
if(!obj[time]) obj[time] = {Time: time} // if we haven't seen this time make a new object at that key
obj[time][label] = val
})
return obj
}, {})
console.log(Object.values(groups))
关于javascript - 检查对象是否有 key ,如果有,添加新 key : value to said object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53657153/