【问题标题】:Passing items of an enum - JavaScript传递枚举项 - JavaScript
【发布时间】:2017-06-30 18:50:10
【问题描述】:

我是 JavaScript 新手。我将以下代码放在一起以获取枚举中的项目,将其推送到数组,然后从数组中读回。由于某种原因,我推送到数组的内容与我读取数组时得到的内容不同。我可以想到一些关于它可能如何发生的理论,例如当我将一个元素从枚举推送到数组时,如果这是数组中的唯一元素,当它被读回时,它将被解释为枚举中的第一个元素但我希望能更好地解释这是如何发生的:这是我的代码:

var dataEnum = {
    0: {Name: "A", Number: "1"},
    1: {Name: "B", Number: "2"},
    2: {Name: "C", Number: "3"},
    3: {Name: "D", Number: "4"},
    4: {Name: "E", Number: "5"}
};

var dataArray = [];

for (var x in dataEnum) {
  if (dataEnum[x].Number == "3") {
    dataArray.push(x);
    console.log("Object " + x + " with name " + dataEnum[x].Name + " and number " + dataEnum[x].Number + " was pushed in the array");
    // Results in:
    // Object 2 with name C and number 3 was pushed in the array
  }
}

for (var y in dataArray) {
  console.log("Object " + y + " with name " + dataEnum[y].Name + " and number " + dataEnum[y].Number + " was read from the array");
  // Results in:
  // Object 0 with name A and number 1 was read from the array
}

【问题讨论】:

  • 问题不清楚。它应该打印什么?
  • 您的第二个循环正在打印dataEnum[y],而不是dataArray[y]

标签: javascript arrays enums


【解决方案1】:

您正在打印dataEnum[y],但ydataArray 的索引,而不是dataEnumdataArray[y] 中元素的值是dataEnum 的索引,所以你应该打印dataEnum[dataArray[y]]

var dataEnum = {
    0: {Name: "A", Number: "1"},
    1: {Name: "B", Number: "2"},
    2: {Name: "C", Number: "3"},
    3: {Name: "D", Number: "4"},
    4: {Name: "E", Number: "5"}
};

var dataArray = [];

for (var x in dataEnum) {
  if (dataEnum[x].Number == "3") {
    dataArray.push(x);
    console.log("Object " + x + " with name " + dataEnum[x].Name + " and number " + dataEnum[x].Number + " was pushed in the array");
    // Results in:
    // Object 2 with name C and number 3 was pushed in the array
  }
}

for (var y in dataArray) {
  console.log("Object " + dataArray[y] + " with name " + dataEnum[dataArray[y]].Name + " and number " + dataEnum[dataArray[y]].Number + " was read from the array");
  // Results in:
  // Object 0 with name A and number 1 was read from the array
}

【讨论】:

    【解决方案2】:

    你可以用一些高阶函数来简化它:

    const dataEnum = {
        0: {Name: "A", Number: "1"},
        1: {Name: "B", Number: "2"},
        2: {Name: "C", Number: "3"},
        3: {Name: "D", Number: "4"},
        4: {Name: "E", Number: "5"}
    };
    
    const result = Object.keys(dataEnum)
      .filter(d => dataEnum[d].Number == "3")
      .map(d => dataEnum[d].Name + " and number " + dataEnum[d].Number + " was read from the array");
    
    console.log(result);
    

    返回["C and number 3 was read from the array"]

    【讨论】:

    • 谢谢罗斯特罗。您的建议非常有效。虽然我需要将项目转移到一个数组中以便稍后检索,但在实际代码中,将有更多元素作为项目列表推送到数组中,这些项目将在以后读取
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2011-08-03
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多