循环数据以创建对象数组

Looping over data to create an array of objects

我正在循环遍历具有两个 tds 的 table 中的行。我在数组中获取了正确的数据,但我想将每个循环放在一个具有键值对的对象数组中。

这是我目前拥有的:

            let test = await page.evaluate(() => {
            let dataStructure = []

            for (let i = 1; i < 13; i++) {
                let main = document.querySelector(".test > table > tbody > tr:nth-child(" + i + ")")
                let data = main.querySelectorAll("td + td")

                data.forEach((x) => {
                    dataStructure.push(
                        x.innerHTML
                    )
                })
            }
            return dataStructure
        })

输出如下所示:

 [
  '',
  '',
  '',
  'Chicago',
  'IL',
  '',
  'US',
  '(12.34567, -12.34567)',
]

但我正在尝试做这样的事情:

[
  {
  adresss: '',
  apt: '',
  message: '',
  city: 'Chicago',
  state: 'IL',
  zip: '',
  country: 'US',
  coordinates: '(12.34567, -12.34567)',
  }
]

执行此操作的简单方法(假设属性始终以相同的顺序等)就是将值分配给属性本身,例如...

// Let's say that 'data' is the array of values from the table.
// Adjust accordingly for the intended layout...
let dataObject = {
    address: data[0],
    apt: data[1],
    // Etc...
    coordinates: data[7]
}

还有多种其他方法可以完成此操作(例如,您可以遍历 属性 个名称的数组并将它们用作赋值)

// Again, assume 'data' is the input array...
// Define a list of property names...
let properties = ["address", "apt", "message", "city", "state", "zip", "country", "coordinates"];
// Create an empty object for storing the values...
let dataObject = {};
for(let v in data) {
    // Assign the value of the v'th data item to the v'th property name of the object
    dataObject[properties[v]] = data[v]
}

假设您的 td 元素中有一些属性可以帮助提供 datastructure 中的键,例如:

<td data-keyname="country">US</td>

 let test = await page.evaluate(() => {
    let dataStructure = []
    let obj = {}
    for (let i = 1; i < 13; i++) {
        let main = document.querySelector(".test > table > tbody > tr:nth-child(" + i + ")")
        let data = main.querySelectorAll("td + td")

        data.forEach((x) => {
            obj[x.getAttribute('data-keyname')] = x.innerHTML
        })
    }
    dataStructure.puch(obj)
    return dataStructure
})