【问题标题】:Having issue with typescript dictionary打字稿字典有问题
【发布时间】:2019-07-09 06:54:42
【问题描述】:

我正在构建一个这样的打字机字典:

const skills = x
        .map(y => y.skills)
        .flat(1)
        .map(z => {
          return { [z.id]: { skill: z } };
        });

这就是我通过上面的代码得到的数组:

{ 7ff2c668-0e86-418a-a962-4958262ee337: {skill: {…}} }
{ c6846331-2e11-45d6-ab8d-306c956332fc: {skill: {…}} }
{ 0fc0cb61-f44d-4fd0-afd1-18506380b55e: {skill: {…}} }
{ 36dc0b74-84ee-4be2-a91c-0a91b4576a21: {skill: {…}} }

现在的问题是我无法按键访问字典:

const id = '7ff2c668-0e86-418a-a962-4958262ee337';
const one = myArr.find(x => x === id); // returns undefined
const two = myArr[id]; // returns undefined

任何想法如何解决?

【问题讨论】:

  • 什么是myArr
  • @NickParsons 是元素数组,例如 { 7ff2c668-0e86-418a-a962-4958262ee337: {skill: {…}} }
  • 并且是xid 就像7ff2c668-0e86-418a-a962-4958262ee337 一样?
  • @NickParsons 正确
  • 按照建议使用地图,它为您提供与字典几乎相同的功能

标签: javascript arrays typescript object


【解决方案1】:

您可以使用Object.keys() 获取每个对象的密钥。在您的情况下,每个对象的关键是它的 id。然后用它来检查它是否等于x(你搜索id)。

请看下面的例子:

const myArr = [
{"7ff2c668-0e86-418a-a962-4958262ee337": {skill: 1}},
{"c6846331-2e11-45d6-ab8d-306c956332fc": {skill: 2}},
{"0fc0cb61-f44d-4fd0-afd1-18506380b55e": {skill: 3}},
{"36dc0b74-84ee-4be2-a91c-0a91b4576a21": {skill: 4}}],

id = "36dc0b74-84ee-4be2-a91c-0a91b4576a21",
one = myArr.findIndex(x => Object.keys(x)[0] === id); // the index of the object which has the search id as its key.

myArr[one] = {newKey: "newValue"}; // set the index found to have a new object
console.log(myArr);

【讨论】:

  • 如何通过 x (id) 重新分配数组中的元素?任何想法如何使方括号工作?
  • 所以你想用id的键将对象换成一个新对象?
  • 是的,这基本上就是我最终要达到的目标。以为我可以使用方括号来做到这一点。
  • @sreginogemoh 方括号仅用于检索内容(除非您将它们设置为其他内容)。我已经更新了我的答案。这是否符合您的要求?在这里它将根据您提供的id 更新skill
  • 我需要通过myArray中的id交换对象
【解决方案2】:

您现在正在创建一个对象数组。我建议你创建一个对象,用你的 id 作为键

例子:

const skills = x
    .map(y => y.skills)
    .flat(1)
    .reduce((acc, z) => {
        acc[z.id] = z;
        return acc;
    }, {});

您的myArr 将类似于:

{
    '7ff2c668-0e86-418a-a962-4958262ee337': {...}
    'c6846331-2e11-45d6-ab8d-306c956332fc': {...},
    '0fc0cb61-f44d-4fd0-afd1-18506380b55e': {...},
    '36dc0b74-84ee-4be2-a91c-0a91b4576a21': {...}
}

然后您可以按照您的预期方式访问它:

const skill = myArr['7ff2c668-0e86-418a-a962-4958262ee337'];

【讨论】:

  • 我以为我正在构建一个打字稿字典[id: string]: any
【解决方案3】:

利用可以提供帮助的地图,

Map 是 ES6 中引入的新数据结构。它允许您存储类似于其他编程语言的键值对,例如爪哇,C#。

let map = new Map();
const skills = x
        .map(y => y.skills)
        .flat(1)
        .map(z => {
          map.set(z.Id,  { skill: z })
          return  map;
        });

//Get entries
amp.get("7ff2c668-0e86-418a-a962-4958262ee337");     //40

//Check entry is present or not
map.has("7ff2c668-0e86-418a-a962-4958262ee337");       //true

【讨论】:

    猜你喜欢
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 2015-12-17
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多