Javascript 打字脚本,在字典中循环

Javascript 打字脚本,在字典中循环,javascript,html,typescript,Javascript,Html,Typescript,在我的代码中,我有两个字典(如建议的)是字符串索引的。由于这是一种即兴创作的类型,我想知道是否有任何关于如何循环遍历每个键(或值,无论如何我都需要这些键)的建议。感谢您的帮助 myDictionary: { [index: string]: any; } = {}; 要循环键/值,请使用for in循环: for (let key in myDictionary) { let value = myDictionary[key]; // Use `key` and `value`

在我的代码中,我有两个字典(如建议的)是字符串索引的。由于这是一种即兴创作的类型,我想知道是否有任何关于如何循环遍历每个键(或值,无论如何我都需要这些键)的建议。感谢您的帮助

myDictionary: { [index: string]: any; } = {};

要循环键/值,请使用
for in
循环:

for (let key in myDictionary) {
    let value = myDictionary[key];
    // Use `key` and `value`
}

Ian提到的键/值循环有一个警告。如果对象可能具有附加到其原型的属性,并且当您在操作符中使用
时,这些属性将包括在内。因此,您需要确保键是实例的属性,而不是原型的属性。较旧的IE以具有
indexof(v)
显示为键而闻名

for (const key in myDictionary) {
    if (myDictionary.hasOwnProperty(key)) {
        let value = myDictionary[key];
    }
}

Object.keys(obj).forEach(key => {
  let value = obj[key];
});
Object.entries(obj).forEach(
  ([key, value]) => console.log(key, value)
);
=ES 2017

Object.keys(obj).forEach(key => {
  let value = obj[key];
});
Object.entries(obj).forEach(
  ([key, value]) => console.log(key, value)
);
这个怎么样

for (let [key, value] of Object.entries(obj)) {
    ...
}

获取所有字典/对象值的最短方法:

Object.keys(dict).map(k => dict[k]);
或者通过以下方式:

Object.entries(dict).map([k,v] => /* ... */);
要获取密钥,请执行以下操作:

function GetDictionaryKeysAsArray(dict: {[key: string]: string;}): string[] {
  let result: string[] = [];
  Object.keys(dict).map((key) =>
    result.push(key),
  );
  return result;
}

答案是好的,但是你应该使用const而不是let作为键,因为它永远不会被更新

for (const key in myDictionary) {
    let value = myDictionary[key];
    // Use `key` and `value`
}

如果只在
中为对象指定
,而不使用If语句
hasOwnProperty
,则会从linter中得到如下错误:

for (const key in myobj) {
   console.log(key);
}
因此,解决方案是使用
Object.keys
of

for (const key of Object.keys(myobj)) {
   console.log(key);
}


希望这个助手是一个使用过梁的人。

您是否尝试过:
for(myDictionary中的var key){}
?在循环内部,您可以使用
key
获取密钥,使用
myDictionary[key]
获取value@Ian只是试过了,似乎不起作用。没有错误,但在statement@Ian啊,对不起,其他地方的一些代码弄乱了它。那太好了!你能给我一个答案让我选择吗?一般来说这不安全;它需要hasOwnProperty测试(如Jamie Stark的回答)或其他东西。@DonHatch它实际上总体上非常安全。在非常特定的情况下(例如,当您包含错误地修改原型的库,或者故意错误地修改原型时),这是不安全的。这取决于开发人员是否用最可能不必要的代码膨胀代码checks@Ian问题是有太多的库可以修改对象原型。当存在更好的简单替代方案时,提倡这种模式似乎不是一个好主意,例如
Object.keys(target).forEach(key=>{let value=target(key);/*Use key,value here*/})。如果你必须展示这种方法,至少要为那些还不太了解的人提一下风险和更好的选择。我们已经有了es6和TypeScript。为什么写自有财产的问题一直没有解决?即使是在2017年,所有的注意力都集中在JS上。我很失望。对于map:
Object.entries(obj.map([key,val])=>console.log(key,'=>',val))不尝试拆分头发,但既然我们讨论的是类型脚本,您不应该使用let键而不是var键吗?回答很好,谢谢。事实上,在当前版本的type script中,
键和
值可以是
const
。最好不要从目标对象调用
hasOwnProperty
检查,而是这样做:
…如果(object.prototype.hasOwnProperty.call)(myDictionary,key))…
否则,如果将eslint与
无原型内置规则一起使用,它将发出一个错误。这是我一直在寻找的解决方案,因为它允许我在迭代之前对键进行排序请参见如何生成
对象。要在TypeScription中工作,条目
需要tsconfig中的lib es2017。请看,这就是我需要克服obj[key]“No index signature…”上的Typescript错误的原因,因为我显式地将我的obj类型设置为{[key:string]:string},而不想使用{[key:string]:any}。有了这个,我就可以访问“值”。谢谢,如果您想完全忽略
,只需将其留空:
[,value]
。(感谢。)这是迄今为止我发现的唯一一种迭代非字符串键索引类型的有效方法