這是一個非常具體的問題,但我有一個帶有陣列的物件:
let rawData = {
one: ["a", "a", "a", "b", "b", "b", "c", "c", "c"],
two: [1,2,3,1,2,3,1,2,3],
three: [1,4,9,3,9,7,6,5,5]
}
我想撰寫一個通用函式,它將基于第一個陣列創建一組嵌套物件(這里是 a,但我想讓這個函式不依賴于特定的鍵。
在我的第一次嘗試中,我撰寫了一個將其決議為物件陣列的函式:
dataframe_for_plot = (data) => {
var length
var names = []
for (var name in data) {
if (data.hasOwnProperty(name))
names.push(name);
length = rawData[name].length;
}
var results = [];
var item;
for (var row = 0; row < length; row ) {
item = {};
for (var col = 0; col < names.length; col ) {
item[names[col]] = data[names[col]][row];
}
results.push(item);
}
return results;
}
哪個產生
dataframe_for_plot(rawData)
[
{one: "a", two: 1, three: 1},
{one: "a", two: 2, three: 4},
{one: "a", two: 3, three: 9},
{one: "b", two: 1, three: 3},
{one: "b", two: 2, three: 9},
{one: "b", two: 3, three: 7},
{one: "c", two: 1, three: 6},
{one: "c", two: 2, three: 5},
{one: "c", two: 3, three: 5},
]
但我想在此函式的基礎上構建以獲得我想要的輸出,其中第一個鍵用于根據該鍵的唯一編號(在本例中為 3)創建物件,并value創建一個新鍵以包含嵌套陣列其他鍵(two在three這種情況下,按 分組one)
let desired_output = [
{
one:"a",
values: [
{two:1, three:1},
{two:2, three:4},
{two:3, three:9}
],
},
{
one:"b",
values: [
{two:1, three:3},
{two:2, three:9},
{two:3, three:7}
],
},
{
one:"c",
values: [
{two:1, three:6},
{two:2, three:5},
{two:3, three:5}
],
}
]
我認為我的函式是一個好的開始,但我需要一些幫助來處理嵌套的第 2 部分!謝謝!
uj5u.com熱心網友回復:
將物件轉換為條目陣列,并獲取第一項的key和vals。減少vals到一個地圖。one如果值(在您的情況下),則 Map 將為第一個陣列中的每個唯一值提供一個物件。然后迭代其他值的陣列,從每[key, arr]對中獲取各自的值,并使用Object.fromEntries().
使用 . 將 Map 值迭代器轉換回陣列Array.from()。
const fn = obj => {
const [[key, vals], ...values] = Object.entries(obj)
return Array.from(vals.reduce((acc, v, i) => {
if(!acc.has(v)) acc.set(v, { [key]: v, values: [] })
acc.get(v).values.push(Object.fromEntries(
values.map(([k, arr]) => [k, arr[i]])
))
return acc
}, new Map()).values())
}
const rawData = {
one: ["a", "a", "a", "b", "b", "b", "c", "c", "c"],
two: [1,2,3,1,2,3,1,2,3],
three: [1,4,9,3,9,7,6,5,5]
}
const result = fn(rawData)
console.log(result)
如果你想控制屬性的順序,你可以傳遞一個order陣列,然后按照你所說的順序手動創建條目:
const fn = (order, obj) => {
const [[key, vals], ...values] = order.map(key => [key, obj[key]])
return Array.from(vals.reduce((acc, v, i) => {
if(!acc.has(v)) acc.set(v, { [key]: v, values: [] })
acc.get(v).values.push(Object.fromEntries(
values.map(([k, arr]) => [k, arr[i]])
))
return acc
}, new Map()).values())
}
const rawData = {
one: ["a", "a", "a", "b", "b", "b", "c", "c", "c"],
two: [1,2,3,1,2,3,1,2,3],
three: [1,4,9,3,9,7,6,5,5]
}
const result = fn(['one', 'three', 'two'], rawData)
console.log(result)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/461792.html
標籤:javascript 数组 目的 函数式编程
