【问题标题】:Typescript iterate over a Record type and return updated RecordTypescript 遍历 Record 类型并返回更新的 Record
【发布时间】:2020-07-14 23:44:41
【问题描述】:

我是 Typescript 的新手,我需要遍历 Record 类型对值进行一些更新并返回 Record

这是定义类型的方式:

type Parent = Readonly<Record<string, Children>>;
type Children = ReadonlyArray<string>;

这里是一些我想迭代的示例数据:

const data = {
    parent1: ["child1", "child2"],
    parent2: ["child1","child2"]
};

更新记录值的方法:

const updateChildren = (child: Children) : Children => {
    return child.map( value => value + 'updated');
}

我正在努力为其编写语法,试图寻找示例但找不到任何有用的东西。

我可以使用 Object.entries 遍历记录

Object.entries(data).forEach(([key, value]) => console.log(key, value));

我也试过用Object.keys

Object.keys(data)
            .map(key => updateChildren(data[key]))

我想我很接近但不知道如何返回地图,因为这里返回 Array [Array]

是否有一些很好的方法来迭代更新,它会以使用的相同类型返回更新后的数据。

感谢阅读。

这是我正在尝试做的 javascript sn-p 并在下面的示例中获取 updatedMap

const data = {
    parent1: ["child1", "child2"],
    parent2: ["child1","child2"]
};

function updateChildren(children) {
  return children.map(child => child+'updated');
}

const updatedMap = new Map();

for (const [key, value] of Object.entries(data)) {
  updatedMap.set(key, updateChildren(value));
}

updatedMap.forEach((value, key) => console.log(key + ":" + value));


console.log(Object.keys(data).map(key => updateChildren(data[key])));

【问题讨论】:

    标签: javascript typescript ecmascript-6 typescript2.0


    【解决方案1】:

    这样的……

    type Children = ReadonlyArray<string>;
    
    const data: Parent = {
      parent1: ["child1", "child2"],
      parent2: ["child1", "child2"],
    };
    
    
    type MutableObject<T> = { -readonly [P in keyof T]: T[P] };
    
    const updateChildren = (child: Children): Children => {
      return child.map(value => value + 'updated');
    }
    
    let newObj: Parent = Object.entries(data).reduce<MutableObject<Parent>>((acc, cur) => {
      acc[cur[0]] = updateChildren(cur[1]);
      return acc;
    }, {})
    
    console.log(newObj)
    
    

    【讨论】:

    • 我正在尝试写这样的东西,但是对于 Parent 类型而不是这个 sn-p Object.keys(data).reduce((map, currentItem) =&gt; { const updated = updateChildren(data[currentItem]); return map.set(currentItem, updated) }, new Map()); 中的映射,所以如果我可以通过 {} 而不是试图想出语法那个。
    • 这里使用 reduce 和 {} 而不是 Map repl.it/@risingBirdSong/GleefulDeepskyblueDatabase#index.ts
    • 未实现,但您可以在这里输入 Map let mapTest = new Map>();
    • 我已经接受了答案,你可以更新它以反映 repl 的变化
    猜你喜欢
    • 2013-02-22
    • 2020-08-20
    • 2012-10-15
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    相关资源
    最近更新 更多