javascript - 检查对象是否有 key ,如果有,添加新 key : value to said object

标签 javascript arrays javascript-objects

我有一个遍历数据数组 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 在控制台上看起来像这样:

enter image description here

k 循环的 visiblePoints 数组派生自 plotData.datapoints,如下所示:

enter image description here

其中 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,检查那里的所有对象以查看是否有匹配的 TimethisRow["Time"] = msToTime(timestamp),如果是,则添加 thisRow[selectedParameter] = visiblePoints[k][1],如果不是,则创建一个新对象。

问题:

  1. 我不确定如何在 JS 中检查这个(我在 Python 方面更有经验,但在这方面没那么多
  2. 我好像做了很多循环。我不确定添加另一个对象来遍历整个 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/

相关文章:

javascript - 如何分配数组中的所有对象?

javascript - 修改元素选择部分的光标属性

c++ - 为什么我在赋值后得到不同的指针值?

javascript - 将包含函数体的 JavaScript 对象转储为 "good enough"可格式化代码

javascript - 在对象创建时添加事件处理程序不起作用?

javascript - 如何在脚本中循环形成 Action ?

javascript - API 调用时的 Angular 定位控制台错误

javascript - 如何将选择从一个选择复制到另一个选择?

javascript - 输入不更新其相关输入

javascript - 如何在前端JavaScript中访问Python(Flask)传递的数组(JSON)?