为什么在遍历相同类型的数组键时会更改它们?

时间:2019-01-13 01:08:26

标签: typescript

var submitting = false;

window.addEventListener("beforeunload", function (event) {
  console.log('checking form');

  let inputValue = document.querySelector('#myInput').value;
  if(inputValue.length > 0 && submitting === false) {
    console.log(inputValue);
    event.returnValue = 'Are you sure you wish to leave?';
  }

  event.preventDefault();

});

document.addEventListener("submit", function(event) { 
  submitting = true;
});

在第一张照片上,它看起来如下:

const expected_keys: String[] = [
    "q",
    "w",
    "e",
    "r",
    "t",
    "y"
];

export function lint(data: any): object {

    var working_keys: String[] = [];
    var linted_data: any = {};

    for (let key in data) {
        console.log(key);                    // Print 1
        if (expected_keys.includes(key)) {
            working_keys.push(key);
        }
    }

    console.log(working_keys);               // Print 2

    for (let key in working_keys) {
        console.log(key);                    // Print 3
        linted_data[working_keys[key]] = data[working_keys[key]];
    }

    return linted_data;
}

在第二张纸上,它也是qwerty。但是,对于第三次打印,我得到的索引是0-5而不是qwerty。为什么是这样?这两个数组都具有相同类型的q w e r t y 。与String[]有关系吗?

获取以下数据:

push()

为什么出现以下错误,但打字稿仍然可以按预期编译并运行?

{
    "q": "info",
    "w": "info",
    "e": "info",
    "r": "info",
    "t": "info",
    "y": "info",
}

3 个答案:

答案 0 :(得分:3)

for...in语法遍历对象的属性。

您的第三次遍历是遍历数组的属性,这些属性实际上是数组中各项的索引。

如果您希望key的值成为数组的一项,则应使用for...of语法或working_keys.forEach来代替。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of

答案 1 :(得分:3)

首先:如果您像working_keys这样访问Array迭代器,更好的方法是使用for .. of循环

第二件事:尝试使用defineProperty构造函数定义对象属性,如下所示:

Object.defineProperty(linted_data, key, { value: data });

最后:我想可能是打字稿类型设置存在问题,所以您将String对象用作键而不是纯基本文字字符串,也许简单的转换可能会解决问题:

linted_data[working_keys[key].toString()] = data[working_keys[key]];

答案 2 :(得分:1)

打印1正在记录对象的键。打印2正在记录string[]。  打印3正在记录string[](0-5)的

如果您希望Print 3记录字符串数组的,请使用for (let key of working_keys)。重要的区别是 of ,而不是 in

typescript docs:

  

for..of与for..in语句for..of和for..in语句   遍历列表;尽管迭代的值不同,   for..in返回要迭代的对象上的键的列表,而   for..of返回列表的数值属性的值   对象被迭代。