【问题标题】:Add additional values to a Typescript JSON key that is defined as an array将附加值添加到定义为数组的 Typescript JSON 键
【发布时间】:2020-04-30 21:10:23
【问题描述】:

我有一个类定义……

class anObj { 
  "ID" : string;
  dialog: {[id : number]:{hide: boolean;}} = {
    0 : {"hide": false},
    14 : {"hide": false}
  }    
}
class manyObjects {
  myGroup: anObj [] = [];
}
...
public stuff = manyObjects;

这完全符合我的要求...我可以使用 id 值作为直接键...

var x:number = 1 //used for a different tier of logic
stuff.myGroup[x].dialog[14].hide!=true

这就是我卡住的地方...我想在组中添加更多对话框。我一路走来……

stuff.myGroup[x].dialog

并且无法弄清楚如何添加类似推送的东西......

.push(7 : {"hide": true})

例如,我可以输入这一行,IDE 说没问题...

stuff.myGroup[x].dialog[[id=7].push({"hide": false})];

但是,当我检查时,该元素没有被添加到数组中......

【问题讨论】:

  • .push() 修改原数组,不返回新数组。
  • 是的,Sunny Patel,我想在现有阵列中添加一个新项目。我还没有尝试退货。您将如何向其中添加新项目?说一个看起来像这样的... 7 : {"hide": true}
  • 我没有添加新对话框。我正在构建我现在所说的非对称键/值对索引数组,例如 myThing: {[myKey: type] :{key1: type; key2: type}} = {"salutation" : {"key1": "Hi"}, {"key2": "你好吗?"}, "conversation" : {"key1": "'s good"}, {"key2": "dem Mets 怎么样?"}} 如果您完全声明所有元素,例如 myThing[salutation].key2 == "How are you?",这将有效。无需通过索引循环所有键就可以很容易地找到特定值。然而!我想添加一个新元素,例如 "departure" : {"key1": "It's been good."}, {"key2": "see ya!"} 并且不能。
  • 这里没有 JSON。 JSON 是一种用于移动和存储数据的文本格式。见There is no such thing as a JSON Object

标签: javascript arrays json typescript key


【解决方案1】:

我可以从您的代码中收集到的是,您正在尝试向包含在 anObj 的“对话框”属性中的对象添加一个新对话框,该对象不是数组。它是一个在 typescript 中具有预期结构的对象:该对象的每个属性都应该是一个数字,每个属性的值都应该是 {hide: boolean;} 类型。

从那里开始,很容易,您添加一个新属性(或覆盖现有的一个),就像为任何 JS 对象所做的那样:

stuff.myGroup[x].dialog[7] = {hide: false};

同样,stuff.myGroup[x].dialog 是一个对象,而不是数组,数组是 stuff.myGroup。 如果您想向 myGroup 添加另一个“组”,那么您可以执行以下操作:

stuff.myGroup.push(new anObj());

编辑

忽略像 stuff 和我的组这样的额外对象产生的噪音的示例,但演示了添加新的键值对:

class anObj { 
  "ID" : string;
  dialog: {[id : number]:{hide: boolean;}} = {
    0 : {"hide": false},
    14 : {"hide": false}
  }    
}
class manyObjects {
  myGroup: anObj [] = [];
}

var obj = new anObj();
obj.dialog[7] = { hide: true };
console.log(obj);

你可以在 typescript 操场上试试 -> https://www.typescriptlang.org/play/?ssl=14&ssc=18&pln=1&pc=1#code/MYGwhgzhAEYHYHkBGAraBvaAoa0BEAkgCJ7QBc0EALgE4CWcA5gNw7QAmdYIA9oxegDadduWhwArgFskAUxoBdMugAWI2RSQ8eIWfGYBfA9AC8GNrgAMY9HjXtZeCgDNuEWQYA0F6AEYALDZ26k7QriDuBmzGuNhRoJAwUvAAnsgossBUMOhsUikA4jQ8EgAOFPDp0IIKptUKrFFYAG5gNNA8qHVwsgDusIioABQAlKydKAB0nNx8ggDstWaY9hrQtBKy0AaswDxwEDqyk7yMQxNjQA

更新 2

要返回对象的可枚举键,可以使用 Object.keys 方法。见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

console.log(Object.Keys(obj));

【讨论】:

  • 我没有添加新对话框。我正在构建我现在所说的非对称键/值对索引数组,例如 myThing: {[myKey: type] :{key1: type; key2: type}} = {"salutation" : {"key1": "Hi"}, {"key2": "你好吗?"}, "conversation" : {"key1": "'s good"}, {"key2": "dem Mets 怎么样?"}} 如果您完全声明所有元素,例如 myThing[salutation].key2 == "How are you?",这将有效。无需按索引循环所有键,就可以很容易地找到特定值。然而!我想添加一个新元素,例如 "departure" : {"key1": "It's been good."}, {"key2": "see ya!"} 并且不能。
  • 你可以随意调用它,在 JavaScript 中它仍然是一个普通的对象。现在的问题是是什么阻止您添加新的键值对:打字稿编译错误或运行时错误?还有什么?我必须重复一遍,您需要注意添加它的位置和方式。我发布的第一个示例涵盖了键值对,其中键是 7,值是对象 {hide: false}
  • 非常酷!我知道了。所以...如果我理解正确...如果我以这种方式声明... keyName: {[id : (number or string)] : {key1: type;键2:类型}};为了添加任何新元素,我根本不使用 push(),而是将新元素视为已经存在,并像这样设置值... dialog[7] = { hide: true , other: 6} ... 然后在未来我可以直接引用它,而不是循环通过键寻找 7,var i = 7; if(dialog[i]!=undefined) { //do something with dialog[7].hide} …这样可以节省大约 30 行代码和大量潜在错误!谢谢!
  • 快速跟进问题...如果不是数组,您如何确定为 obj 声明的对话框数或迭代它们?
  • 更新了您后续问题的答案。
猜你喜欢
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 2013-10-15
  • 1970-01-01
  • 2019-08-28
  • 1970-01-01
相关资源
最近更新 更多