循环数据以创建对象数组
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
})
我正在循环遍历具有两个 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
})