好吧,我知道要求很高。
所以這是我的情況,假設我有下面的物件陣列
var fullData = [{foo1: bar1, foo2: bar2, foo3: bar3},
{foo1: bar4, foo2: bar5, foo3: bar6},
{foo1: bar7, foo2: bar8, foo3: bar6}]
我希望將此更改為
[{name: bar1, label: bar1}, {name: bar4, label: bar4},{name: bar7, label: bar7}]
[{name: bar2, label: bar2}, {name: bar5, label: bar5},{name: bar8, label: bar8}]
[{name: bar3, label: bar3}, {name: bar6, label: bar6}]
我從另一個將 AoO 拆分為陣列物件的執行緒中找到了以下內容。
var result = res.body.reduce((r, o) => {
Object.entries(o).forEach(([k, v]) => (r[k] = r[k] || []).push(v));
return r;
}, Object.create(null));
但它不會過濾重復項,也不會按照我上面標記的方式格式化資料,而且我無法弄清楚上面的函式是如何作業的。對于重復項,我選擇在每個單獨元素上使用 lodash 中的 _.uniq,result但被困在“名稱”和“標簽”格式上,所以我想我會問比我更有經驗的程式員是否有辦法將所有這些合并到 1 個函式中。
uj5u.com熱心網友回復:
您可以通過更改以下內容,在將其推送到陣列之前添加檢查陣列是否具有該元素:
([k, v]) => (r[k] = r[k] || []).push(v)
對此:
r[k] = r[k] || []
if(!r[k].includes(v)) r[k].push(v)
var fullData = [{foo1: 'bar1', foo2: 'bar2', foo3: 'bar3'},
{foo1: 'bar4', foo2: 'bar5', foo3: 'bar6'},
{foo1: 'bar7', foo2: 'bar8', foo3: 'bar6'}]
var result = fullData.reduce((r, o) => {
Object.entries(o).forEach(([k, v]) => {
r[k] = r[k] || []
if(!r[k].includes(v)) r[k].push(v)
});
return r;
},
Object.create(null));
console.log(result)
如果您希望將結果展平為陣列陣列,您可以遍歷先前結果的條目并將其推入新陣列
var fullData = [{foo1: 'bar1', foo2: 'bar2', foo3: 'bar3'},
{foo1: 'bar4', foo2: 'bar5', foo3: 'bar6'},
{foo1: 'bar7', foo2: 'bar8', foo3: 'bar6'}]
var tmpResult = fullData.reduce((r, o) => {
Object.entries(o).forEach(([k, v]) => {
r[k] = r[k] || []
if(!r[k].includes(v)) r[k].push(v)
});
return r;
},
Object.create(null));
var result = [];
Object.keys(tmpResult).forEach(k => {
result.push(
tmpResult[k].map(v => ({name: k, value: v}))
);
})
console.log(result)
我知道這似乎效率低下,但我確信這值得一試。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/338023.html
標籤:javascript 数组 目的 洛达什
上一篇:如何使用PerformanceNavigationTimingAPI來跟蹤跨網路作業者和跨源iframe的任務持續時間?
