我想將物件鍵提取到單個陣列中,并將值提取到不同的陣列中,以便我可以將標題和值粘貼到谷歌表中。
我想實作一個動態代碼,以便如果從 API 中提取更多欄位,它可以將標題映射到值。
//API Response Sample.
var data = [
{
"actions": [
{
"action_type": "comment",
"value": "3"
},
{
"action_type": "like",
"value": "33"
},
{
"action_type": "link_click",
"value": "1531"
},
{
"action_type": "mobile_app_install",
"value": "1049"
}
],
"spend": "8621.03",
"date_start": "2017-10-28",
"date_stop": "2017-11-26"
}
]
到目前為止,下面的代碼是固定的而不是動態的。
const sheet = SpreadsheetApp.getActiveSheet();
//flatten the objects
var actionObjects = data.map(returnAction)
//get the headers
var headers = Object.keys(actionObjects[0])
//create a 2D array for rows
var actionRows = actionObjects.map(a => headers.map(h => a[h]))
//write the headers
sheet.getRange(sheet.getLastRow() 1, 1, 1, headers[0].length).setValues([headers]);
//write the rows
sheet.getRange(sheet.getLastRow() 1, 1, actionRows.length, actionRows[0].length).setValues(actionRows);
}
function returnAction(data){
let action = {}
data.actions.forEach(a => action[a.action_type] = a.value)
action ['spend'] = data.spend
action ['date_start'] = data.date_start
action ['date_stop'] = data.date_stop
return action
}
uj5u.com熱心網友回復:
物件鍵進入陣列:
const keys = Object.keys(obj);
物件值放入陣列:
const values = Object.values(obj);
或者兩者同時...
const keys = [];
const values = [];
for (const [key,value] of Object.entries(obj)) {
keys.push(key);
values.push(value);
}
如果你的物件的結構沒有改變......也許是這樣的?
const action = {};
data.forEach(obj => {
for (const [key,value] of Object.entries(obj)) {
if (Array.isArray(value)) {
for (const o of value) {
const a = Object.values(o);
action[a[0]] = a[1];
}
} else action[key] = value;
}
})
嘗試這個:
function setResult() {
const sheet = SpreadsheetApp.getActiveSheet();
class getResults {
constructor(arr) {
this.headers = {};
this.results = [];
for (const obj of arr) {
const actions = {};
for (const [header,value] of Object.entries(obj)) {
if (Array.isArray(value)) {
for (const action of value) {
const values = Object.values(action);
actions[values[0]] = values[1];
this.headers[values[0]] = values[0]
}
} else {
actions[header] = value;
this.headers[header] = header;
}
}
this.results.push(actions);
}
}
get array() {
const headers = Object.keys(this.headers);
const results = [headers];
for (const action of this.results) {
results.push(headers.map(header => !!action[header] ? action[header] : ''));
}
return results;
}
}
const values = new getResults(data).array;
sheet.getRange(sheet.getLastRow() 1, 1, values.length, values[0].length).setValues(values);
}
這是一個完整的函式,它接收“資料”陣列物件并將其拆分到您的電子表格中。
說明:這個函式主要寫在Object建構式和Classes中。
更多關于 JavaScript 中的物件建構式
更多關于 JavaScript 中的類
根據您的示例資料,陣列中有物件,我相信這些物件中的每一個都是一組資料。
因此,第一步是使用for ... of回圈使用這行代碼分別處理每個資料集,這與原始代碼中for (const obj of arr) {}的行非常相似。更多關于 for ... of 在 JavaScript 中var actionObjects = data.map(returnAction)
對于您的每個資料物件,它有 2 個主要結構,一個是Array: Object: {Key1: Value1, Key2: Value2},您希望 Value1 作為標頭,Value2 作為輸出中的實際值。TWO 只是Key: Value對,您需要將鍵作為標頭,將值作為輸出的值。
為了處理給定的資料集切片,這一行for (const [header,value] of Object.entries(obj)) {}使用另一個for...of回圈和Object.entries()函式將給定的物件解構為一個二維陣列,其中每個陣列值都是一個陣列,其中包含來自給定物件的一對 [key,value]。更多關于 Object.entries()
然后,if (Array.isArray(value)) {}將檢查函式給定的每個值for...of Object.entries(),如果是陣列,則滿足條件一,否則滿足條件二。
對于條件 ONE,您希望將物件的第一個值用作標題,將第二個值用作實際值。
for (const action of value) {}將物件的“值”迭代為陣列,并將值存盤{value[0]: value[1]}在進入回圈函式之前宣告的物件中以供以后使用。
對于條件二,只需將其存盤到與條件一使用的格式相同的物件中{key: value}。
在每個回圈結束時,在進入下一個資料物件之前,將key: value存盤在此回圈中的對(命名為actions)推送到結果陣列中。
直到這一步,你已經有了一個如下所示的陣列:
Array: [
Object1: {
header1: value1,
header2: value2,
header3: value3,
header4: value4,
...
},
...
]
宣告物件this.header {}以跟蹤最大標題列計數的長度,并洗掉任何重復項(因為物件鍵不能重復)。即使您的某些資料物件可能具有與其他資料物件不同的標頭,這也有助于保持該功能正常作業。
在這些回圈迭代資料陣列中的每個物件之后,使用 getter 函式創建的自定義方法get array()將所有資料的最終結果形成一個二維陣列,供應用程式腳本.setValues()函式將其列印到電子表格中。更多關于吸氣劑
如果您主要關心的是類和物件建構式,那么這里是另一個版本的代碼,沒有使用它們中的任何一個:
function setResult2() {
const sheet = SpreadsheetApp.getActiveSheet();
const headers = {};
const results = [];
for (const obj of data) {
const actions = {};
for (const [header,value] of Object.entries(obj)) {
if (Array.isArray(value)) {
for (const action of value) {
const values = Object.values(action);
actions[values[0]] = values[1];
headers[values[0]] = values[0]
}
} else {
actions[header] = value;
headers[header] = header;
}
}
results.push(actions);
}
const getArray = (results,headers) => {
const headers_final = Object.keys(headers);
const results_final = [headers_final];
for (const action of results) {
results_final.push(headers_final.map(header => !!action[header] ? action[header] : ''));
}
return results_final;
}
const values = getArray(results,headers);
console.log(values)
sheet.getRange(sheet.getLastRow() 1, 1, values.length, values[0].length).setValues(values);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/529454.html
上一篇:計算檔案中的字符數
