我想創建一個函式,該函式接受一個物件陣列、一個物件和一個鍵的輸入,并回傳一個物件陣列,如果它是一個新的物件,則該陣列中的新物件位于0位置,如果它不是一個新的物件,則位于相同的位置。密鑰用于比較物件,可以是一個字串或數字。
這個是我寫的,但是在Objects里面必須要有一個id屬性。
export function addOrReplaceById< T extends Array<{ id: string }>>(
arrayOfObjects: T,
newObject: { id: string }
): T {
const index = arrayOfObjects.findIndex((object) => /span> object. id ===newObject.id)。)
if (index === -1) {
arrayOfObjects.unshift(newObject)。
} else {
arrayOfObjects[index] = newObject;
}
return arrayOfObjects;
}
uj5u.com熱心網友回復:
考慮到這個例子:
export function addOrReplaceById<
Obj extends { id: string },
Arr extends Array<Obj>
>(
arrayOfObjects: [...Arr]。
newObject: Obj
) {
const data = arrayOfObjects
.reduce<{ exists: boolean, arr: Obj[] }>(
(acc, obj) =>
obj.id ==newObject.id ? {
...acc,
exists: true,
arr: [...acc.arr, newObject] 。
} : acc, {
exists: false,
arr: []
});
return data.exists ? data.arr : [newObject, ... data.arr]
}
上面的例子將減少一點復雜性。unshift操作很昂貴。這就是為什么我創建了新的資料結構 {exists: boolean, arr:Obj[]}。
我還回傳了新的陣列,而不是現有陣列的突變
。uj5u.com熱心網友回復:
你可以這樣寫你的函式:
export function addOrReplaceByKey<T extends {[x: string]: any}>(
arrayOfObjects: T[],
newObject: T。
key: T的key。
): T[] {
const index = arrayOfObjects.findIndex((object) => object[key] ==newObject[key]) 。
if (index ==-1) {
arrayOfObjects.unshift(newObject)。
} else {
arrayOfObjects[index] = newObject;
}
return arrayOfObjects;
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/329137.html
標籤:
