我有一個如下所示的資料結構:
{
FL: [{ ID: 1, confirmed: true }, { ID: 2, confirmed: false }],
TX: [{ ID: 3, confirmed: true }],
NY: [{ ID: 4, confirmed: false }, { ID: 5, confirmed: true }],
}
而且我需要能夠遍歷此資料中的每個專案并找到其ID值等于已知 ID 的專案。我不確定如何解決這個問題。
我唯一能想到的是一個 for-in 回圈,但我必須在回圈物件后映射陣列,這樣看起來不太干凈。
是否有任何方法可以干凈地處理如此深度嵌套的資料的迭代?
uj5u.com熱心網友回復:
Array.prototype.find幫助人們在陣列中查找物件,并將Object.values物件的所有值作為陣列回傳,而Array.prototype.flat有助于展平陣列陣列。
下面的實作還使用了一個箭頭函式運算式作為find回呼函式以及一個destructuring_assignment,該函式用于從作為引數傳遞給回呼的物件中解包欄位。
function findObjectByID(obj, id) {
return Object
.values(obj)
.flat()
.find(({ ID }) => ID === id);
}
const sampleData = {
FL: [{ ID: 1, confirmed: true }, { ID: 2, confirmed: false }],
TX: [{ ID: 3, confirmed: true }],
NY: [{ ID: 4, confirmed: false }, { ID: 5, confirmed: true }],
};
console.log(
'findObjectByID(sampleData, 2) ...',
findObjectByID(sampleData, 2)
);
console.log(
'findObjectByID(sampleData, 3) ...',
findObjectByID(sampleData, 3)
);
console.log(
'findObjectByID(sampleData, 5) ...',
findObjectByID(sampleData, 5)
);
.as-console-wrapper { min-height: 100%!important; top: 0; }
一種更好的方法是,如果 OP 必須從原始資料結構中非常頻繁且重復地查詢物件,則將此結構恰好一次轉換為平面物件,然后用作ID自定義資料項的基礎映射或索引(例如,每個項保持與其原始類別或元鍵(如'FL','TX'或'NY')的關系。
上面提供的示例代碼將被重構為下一個類似的代碼......
function createIdBasedItemIndex(rawData) {
return Object
.entries(rawData)
.flatMap(([category, itemList]) =>
itemList.map(item => ({ category, item }))
)
.reduce((index, data) =>
Object.assign(index, { [data.item.ID]: data }), {}
);
}
const sampleData = {
FL: [{ ID: 1, confirmed: true }, { ID: 2, confirmed: false }],
TX: [{ ID: 3, confirmed: true }],
NY: [{ ID: 4, confirmed: false }, { ID: 5, confirmed: true }],
};
const categoryItemIndex = createIdBasedItemIndex(sampleData);
console.log({ sampleData, categoryItemIndex });
console.log('categoryItemIndex[2] ...', categoryItemIndex[2]);
console.log('categoryItemIndex[3] ...', categoryItemIndex[3]);
console.log('categoryItemIndex[5] ...', categoryItemIndex[5]);
.as-console-wrapper { min-height: 100%!important; top: 0; }
uj5u.com熱心網友回復:
這是一種保留密鑰并回傳匹配項的方法。
let obj = {
FL: [{ID: 1, confirmed: true},{ID: 2, confirmed: false}],
TX: [{ID: 3, confirmed: true}],
NY: [{ID: 4, confirmed: false}, {ID: 5, confirmed: true}]
}
const findFromId = (obj, id) => {
for (let x in obj) {
if (res = obj[x].find(a => a.ID == id)) return { [x]: res }
}
return null;
}
console.log(findFromId(obj, 5))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/411933.html
標籤:
