Проверьте, есть ли у ключа ключ, если да, добавьте новый ключ: значение к указанному объекту. - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть цикл, который перебирает массив данных 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)
    }
}

Давайте упростим и скажем, что у меня есть только2 элемента в подмассиве visisblePoints для каждого plotData массива, вот так (каждый массив 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

Массив visiblePoints для цикла k получен из 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, проверить все объекты там, чтобы увидеть, есть ли ключ Time, который соответствует thisRow["Time"] = msToTime(timestamp), и если так, добавьте thisRow[selectedParameter] = visiblePoints[k][1] к этому, если нет, создайте новый объект.

Проблемы:

  1. I 'я не уверен, как это проверить в JS (у меня больше опыта работы с Python, и не очень)
  2. Кажется, я делаю кучу циклов.Я не уверен, что добавление еще одного, чтобы просмотреть весь dataArray и проверить все объекты, чтобы увидеть, существует ли ключ в одном из них, является лучшим решением здесь.Массив plotData.visiblePoints может быть длиной 500+.

[EDIT] Упрощенный вопрос.Добавлены примеры картинок.Добавлены текстовые примеры массива k.

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Вы можете взять Map или хеш-таблицу, в которой сохраняется ссылка на объект в то же время.

var map = new Map,
    timestamp,
    row;

// later in loop
timestamp = msToTime(new Date(visiblePoints[k][0]));
row = map.get(timestamp);
if (!row) {
    map.set(timestamp, row = { Time: timestamp });
}
row[selectedParameter] = visiblePoints[k][1];

// at the end assign the array
dataArray = Array.from(map.values())
0 голосов
/ 06 декабря 2018

Вы можете построить объект, связанный с группировкой - в этом случае отметка времени.Это позволит вам получить произвольный доступ к нужному элементу без поиска в массиве.Когда вы закончите, 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))
0 голосов
/ 06 декабря 2018

Вы можете узнать, есть ли у Object определенный ключ, вызвав метод hasOwnProperty.

const obj = {
  "bar": [1,2,3],
  "foo": "im foo"
};

console.log(obj.hasOwnProperty("bar"))
console.log(obj.hasOwnProperty("bar2"))

И вам нужно следовать этой схеме.

var dataArray = []

for (i = 0; i < 1; i++) {

    for (k = 0; k < 2; k++) {
    
        thisRow = {};
        thisRow["Time"] = k+1 * i+1
        thisRow["foo"] = i+1
        thisRow["var"] = k+1
        dataArray.push(thisRow)
    }
}

console.log(dataArray)
...