我有一個包含遞回物件的陣列,如下所示:
export const a: A = [
{
person: [
{
person: [{
person: [],
rating: 512,
justNumbers: [30, 15, 327]
},
{
person: [
{
person: [],
rating: 538,
justNumbers: [13, 55, 643]
},
{
person: [],
rating: 964,
justNumbers: [314, 523, 512]
}
],
rating: 413,
justNumbers: [876, 541, 623]
}],
rating: 176,
justNumbers: [842, 812,643]
}
],
rating: 235,
justNumbers: [33, 565, 73]
}];
我需要創建一個函式來以遞回方式對所有評分求和,并從每個 justNumbers 陣列中的所有數字創建一個數字陣列,該陣列按升序排序。
const recursiveNumbersSearch = (obj: object, targetKey: string, getSum = []) => {
const r = getSum;
Object.keys(obj).forEach(key => {
const value: any = obj[key];
if (key === targetKey && typeof value !== 'object') {
r.push(value)
} else if (typeof value === 'object') {
recursiveNumbersSearch(value, targetKey, r);
}
})
return getSum
}
function sumArray (arr : number[]): number {
let arraySum: number = 0;
for (let i = 0; i<= arr.length - 1; i ) {
arraySum = arr[i] arraySum;
}
return arraySum;
}
我這樣做了,它可以很好地計算總和,但是,幾乎沒有編譯器錯誤是:
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{}'.
No index signature with a parameter of type 'string' was found on type '{}'.
Argument of type 'any' is not assignable to parameter of type 'never'.
第一個用于字串:
const value: any = obj[key];
當第二個指的是:
r.push(value)
我有點困惑,因為如果我用 node 運行編譯的 JS 檔案,它會正確計算總和,但它確實指向了這兩個錯誤。
另一方面,我無法使用 recursiveNumberSearch 方法推送 justNumbers 陣列。
uj5u.com熱心網友回復:
我認為您遇到陣列問題的原因是因為您 test typeof value === 'object',但如果value在 Array.
在這里,我寫了我認為是 的更簡單版本recursiveNumbersSearch,稱為deepProp. 它接受一個屬性名稱并回傳一個函式,該函式接受一個物件并進行深度優先遍歷,在找到的任何地方檢索命名屬性。然后我們可以使用它來對簡單的函式進行分層以對rating屬性求和或對屬性進行展平和排序justNumbers,如下所示:
const deepProp = (prop) => ({[prop]: p, ...rest}) =>
p == undefined
? Object .values (rest) .flatMap (deepProp (prop))
: [p, ... deepProp (prop) (rest)]
const a = [{person: [{person: [{person: [], rating: 512, justNumbers: [30, 15, 327]}, {person: [{person: [], rating: 538, justNumbers: [13, 55, 643]}, {person: [], rating: 964, justNumbers: [314, 523, 512]}], rating: 413, justNumbers: [876, 541, 623]}], rating: 176, justNumbers: [842, 812, 643]}], rating: 235, justNumbers: [33, 565, 73]}]
console .log (deepProp ('rating') (a))
console .log (deepProp ('justNumbers') (a))
const sum = (ns) => ns .reduce ((a, b) => a b, 0)
const sumRatings = (o) => sum (deepProp ('rating') (o))
const organizeNumbers = (o) => deepProp ('justNumbers') (o) .flat () .sort ((a, b) => a - b)
console .log (sumRatings (a))
console .log (organizeNumbers (a))
.as-console-wrapper {max-height: 100% !important; top: 0}
恐怕我對您的 Typescript 錯誤無能為力。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/359894.html
標籤:javascript 数组 打字稿 递归
上一篇:如何將陣列變成陣列但像樹一樣
下一篇:串列遞回和字串構建
