【问题标题】:Get value by key from array javascript从数组javascript中按键获取值
【发布时间】:2017-08-15 07:44:57
【问题描述】:

我在从 javascript 数组中获取值时遇到问题。

var color = new Array();
for (var i = 0; i < datafeatures.length - 1; i++) {
    color[datafeatures[i].properties.userid] = datafeatures[i].properties.linecolor;
}

snapshot.forEach(function (childSnapshot) {
     var colour = childSnapshot.wp_user;
     console.log(color[colour]);
     console.log(JSON.stringify(color));
     console.log(color);
     console.log(colour);
}

Console.log 结果:

颜色[颜色]:未定义

JSON.stringify(color): []

颜色:

[]
 26: "#9d36ee"
 45: "#b1c743"
 56: "#f9c53c"
 61: "#d770ce"
 63: "#267fa1"
 64: "#85002f"
 68: "#78eca8"
 92: "#a4a2e7"
length: 93
__proto__: Array(0)

颜色: 61

颜色[颜色]的预期输出:“#d770ce”

颜色[颜色]的实际输出:未定义。

Color 里面有东西,Color 是一个数字(键),但似乎不可能从 Color 中获取值..

【问题讨论】:

  • 您的颜色很可能有问题,我们无法测试您的代码,因为我们无法测试有问题的区域。请创建测试环境或创建假数组以查看其工作原理。
  • 你在遍历snapshot,那个变量是正确的吗?
  • 为了一致性和代码清晰性(也按照惯例),您应该将数组(或对象)命名为 colours 及其元素之一 colour。将数组命名为 color 及其元素之一 colour 只是令人困惑。
  • @jkris 是的,console.log(JSON.strinify(color)); 返回 [],正如您在下面的回答中指出的那样,将颜色数组更改为对象时,它返回 {}
  • 在forEach console.log(color)之前做一个控制台日志

标签: javascript arrays dynamic key


【解决方案1】:

您可能想尝试换行

var color = new Array();

var color = {};

您可能要查找的不是数组,而是 javascript 中的术语 object

编辑

查看源代码并进行一些调试后,问题似乎是异步执行。您的 color 变量稍后会被填充,这就解释了为什么 JSON.stringify 在打印时会生成一个空对象,而 console.log 会维护对变量的引用。

您需要确保首先填充 color 变量。

关于我如何调试它的一些步骤,(使用 chrome):

  • 打开 Chrome 开发工具 (Ctrl+Shift+I)
  • 转到控制台
  • 点击打印undefined的行号
  • 您应该会被发送到sources 选项卡,您将在其中看到您的源代码
  • 在此处通过单击行号(本例中为 407)添加断点
  • 在开发工具窗口中刷新,(Ctrl+R)
  • javascript 执行应在调试器处停止
  • 在此状态下,将鼠标悬停在源代码上的变量上即可查看它们在该时间点的值
  • 你会发现color确实是一个空对象
  • 所以追溯color 的填充方式
  • 发现它嵌套在这段代码d3.json(
  • 这时您就知道遇到了异步问题

【讨论】:

  • var color = {};仅将 color[] 更改为 color{}
  • 没错,然后它就可以工作了。你得到一个带有你可以寻址的键的对象。数组没有键,它们只是一个列表。
  • 不,color[colour] 返回undefined
  • 天哪,在您编辑之后,我意识到我的代码的整个部分都在异步之外。要求。谢谢你一千次!
【解决方案2】:

这里是代码

for (var i = 0; i < datafeatures.length - 1; i++) {
    color[datafeatures[i].properties.userid] = datafeatures[i].properties.linecolor;
}

应该更像这样

for (var i = 0; i < datafeatures.length - 1; i++) {
    color.push({[datafeatures[i].properties.userid]: datafeatures[i].properties.linecolor})
}

我想它会给你你正在寻找的数组。

【讨论】:

  • 不,你正在构造一个对象数组:[{26: "#9d36ee"} , {45: "#b1c743"}]
  • 基于他从构造new Array() 开始的事实 - 我认为他可能想要一个对象数组。
  • 但是你如何获得 63 的颜色呢?这个解决方案比它应该的更复杂。 OP不知道他想要什么。他制作了一个数组,但不想要它,因为这里的解决方案实际上是构建一个对象{ "26" : "#9d36ee", "63" : "#b1c743"} 然后你很容易得到 coulour 63 : colours["63"]
  • @JeremyThille 是正确的。但是当将 var color = [] 更改为 'var color = {}' 时,我在 console.log 中得到完全相同的结果(只有 '[]' 被替换为 '{}')
  • 我们可以看到snapshot 数组吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-07
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多