我有一些資料要輸出到 Excel。我的正常函式與“正常”資料一起正常作業給我帶來了問題,特別是,我undefined在變數中看到回傳的陣列MappedArrays并且似乎丟失了一行資料。
我試圖簡化問題以制作 MCVE,這甚至可能不是問題,但我希望我的主要功能能夠正確處理。
假設我有一堆帶有未知數量的鍵的物件,并不是每個物件都有每個鍵。
我目前有一個函式來確保每個物件都有每個鍵(這是在excel中粘貼資料所需要的,值可以是null)。
我有另一個函式將物件陣列轉換為映射陣列的陣列,其中所有值都應按索引定位。
在我的測驗資料中,我"Header_E": "Test",在一個物件中有一行,它當前正在輸出,看起來像是物件中的索引,它應該與標題/列的索引相關聯。
Header_A Header_B Header_C Header_D Header_E Header_F
2AVal 2BVal
3AVal 3BVal
4AVal 4BVal 4DVal
Test
如何確保物件陣列中的所有物件都具有所有鍵,然后將該 ArrOfObjs 映射到一個陣列,其中資料索引到物件鍵
這是我的示例資料:
async function CommandsFunc(event) {
try {
await Excel.run(async (context) => {
//Start Func.
var ws = context.workbook.worksheets.getActiveWorksheet();
var Obj_One_A = {
"Header_A": "2AVal",
"Header_B": "2BVal",
}
var Obj_Two_A = {
"Header_A": "3AVal",
"Header_B": "3BVal",
}
var Obj_One_B = {
"Header_A": "4AVal",
"Header_B": "4BVal",
"Header_D": "4DVal",
}
var Obj_Two_B = {
"Header_A": "",
"Header_C": "",
"Header_E": "Test",
"Header_F": "",
}
var Arr_Of_Items = [Obj_One_A, Obj_Two_A]
//await Do_Arr_Of_Objs_Or_Arrs_To_Rng(context, ws, Arr_Of_Items)
var HeaderArr = ["Header_A", "Header_B"]
var MappedArrays = await Get_Mapped_Over_Array_Of_Objects(Arr_Of_Items, HeaderArr)
MappedArrays.unshift(HeaderArr)
var rng = ws.getRangeByIndexes(0, 0, MappedArrays.length, MappedArrays[0].length)
rng.select()
await context.sync();
rng.values = MappedArrays
await context.sync();
var Arr_Of_Items = [Obj_One_B, Obj_Two_B]
var All_Headers_Arr = ["Header_A", "Header_B", "Header_C", "Header_D", "Header_E", "Header_F"]
var MappedArrays = await Get_Mapped_Over_Array_Of_Objects(Arr_Of_Items, All_Headers_Arr)
var Used_Rng = ws.getUsedRange(true)
Used_Rng.load('rowCount')
await context.sync()
var rng = ws.getRangeByIndexes(Used_Rng.rowCount, 0, MappedArrays.length, All_Headers_Arr.length)
//Set Headers
for (let ai = 0; ai < All_Headers_Arr.length; ai ) {
ws.getUsedRange(true).getRow(0).getCell(0, ai).values = All_Headers_Arr[ai]
}
rng.select()
await context.sync();
rng.values = MappedArrays
await context.sync();
//await Do_Arr_Of_Objs_Or_Arrs_To_Rng(context, ws, Arr_Of_Items)
//End Func
await context.sync();
});
} catch (error) {
console.log(error)
}
try { event.completed() } catch (error) { }
}
輔助功能:
async function Get_Mapped_Over_Array_Of_Objects(ArrayOfObjs, MapArr) {
ArrayOfObjs = await Do_All_Arr_Of_Objs_Same_Keys(ArrayOfObjs, MapArr)
let MappedArrays = []
for (let i = 0; i < ArrayOfObjs.length; i ) {
var obj = ArrayOfObjs[i]
var arr = Object.keys(obj).map((k) => obj[k])
MappedArrays.push(arr)
}
return MappedArrays;
}
async function Do_All_Arr_Of_Objs_Same_Keys(Arr_Of_Objs, Keys_Arr) {
for (let oi = 0; oi < Arr_Of_Objs.length; oi ) {
var obj = Arr_Of_Objs[oi]
var Obj_Keys = Object.keys(obj)
if (Keys_Arr.length != Obj_Keys.length) {
var temp_arr = []
temp_arr = Keys_Arr
for (let ki = 0; ki < Obj_Keys.length; ki ) {
temp_arr = await Do_Remove_Arr_By_Val(temp_arr, Obj_Keys[ki])
}
for (let ai = 0; ai < temp_arr.length; ai ) {
obj[temp_arr[ai]] = ""
}
}
}
return Arr_Of_Objs
}
function Do_Remove_Arr_By_Val(arr, val) {
var filteredArray = arr.filter(function (e) { return e !== val })
return filteredArray
}
uj5u.com熱心網友回復:
您的問題來自這一行:
var arr = Object.keys(obj).map((k) => obj[k])
這是按在物件中定義鍵的順序將值推入arr,這對于每個物件來說不一定相同。您會注意到,在示例輸出的第三行中,列中有 for 的值Header_D,Header_C這是同一問題的表現。
由于您知道在使用此函式時每個物件都具有相同的鍵集,因此您應該迭代該鍵的常量串列 ( All_Headers_Arr) 而不是Object.keys(obj). 這將確保 的所有值arr都被一致地索引。
話雖如此,我認為也有可能按照這段代碼來簡化您的代碼。
var Obj_One_A = { "Header_A": "2AVal", "Header_B": "2BVal" }
var Obj_Two_A = { "Header_A": "3AVal", "Header_B": "3BVal" }
var Obj_One_B = { "Header_A": "4AVal", "Header_B": "4BVal", "Header_D": "4DVal" }
var Obj_Two_B = { "Header_A": "", "Header_C": "", "Header_E": "Test", "Header_F": "" }
var Arr_Of_Items = [Obj_One_A, Obj_Two_A, Obj_One_B, Obj_Two_B]
// get a list of unique headers
let Headers = new Set()
Arr_Of_Items
.forEach(o => Object.keys(o)
.forEach(k => Headers.add(k))
)
// convert to an array
All_Headers = Array.from(Headers.values()).sort()
// make sure each object has all the headers, assigning null values to any missing headers
const MappedArrays = Arr_Of_Items
.map(o => All_Headers
.map(h => o.hasOwnProperty(h) ? o[h] : null)
)
console.log(MappedArrays)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/463609.html
標籤:javascript 数组 目的
上一篇:將3個陣列轉換為一個物件
