【问题标题】:How to recursively get access to object values?如何递归访问对象值?
【发布时间】:2021-12-28 07:27:24
【问题描述】:

我有一个包含递归对象的数组,如下所示:

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 数组。

【问题讨论】:

    标签: javascript arrays typescript recursion


    【解决方案1】:

    我认为您遇到数组问题的原因是因为您测试了typeof value === 'object',但如果value 在数组中,情况就会如此。

    在这里,我写了我认为是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 错误无能为力。

    【讨论】:

      猜你喜欢
      • 2012-06-06
      • 2021-07-03
      • 2013-05-12
      • 2012-10-02
      • 2017-12-02
      • 2021-10-23
      • 1970-01-01
      • 2020-04-04
      • 2019-05-28
      相关资源
      最近更新 更多