在javascript中访问简单数组值

在javascript中访问简单数组值,javascript,jquery,Javascript,Jquery,我现在已经筋疲力尽,无法访问javascript中最简单的数组值, 好的,我已经打印了console.log(dataArray) 控制台输出: [] account_level : "-" address : "-" atm_issued : "-" avatar : "-" branch : "-" cnic : "-" 这就是我试图通过以下方式访问的内容: console.log(dataArray['cnic']) 由此 consol

我现在已经筋疲力尽,无法访问javascript中最简单的数组值, 好的,我已经打印了
console.log(dataArray)

控制台输出:

[]
    account_level : "-"
    address : "-"
    atm_issued : "-"
    avatar : "-"
    branch : "-"
    cnic : "-"

这就是我试图通过以下方式访问的内容:

console.log(dataArray['cnic'])
由此

console.log(dataArray.cnic)
通过这个

console.log(dataArray[cnic])
如果我这样做了

console.log(dataArray.cnic)
它打印未定义的

console.log(dataArray.length, dataArray instanceof Array, dataArray instanceof Object);
以上各项的产出:

0对-对


如何访问此属性?

您使用的语法是访问对象的方式

let对象={
帐户级别:“-”
地址:“—”
自动提款机发出:“—”
阿凡达:“-”
分行:“—”
cnic:“-”
};

console.log(object.cnic)在您的情况下,您不能像这样定义
数组
,因为不兼容

我建议您使用以下代码段所示的方法来代替此方法:

var obj={
帐户级别:“数据”,
地址:“-”,
atm_发行:“-”,
阿凡达:“-”,
分行:“-”,
cnic:“-”
};

控制台日志(对象帐户级别)
您指定的是类似于
对象的东西,而不是
数组。在
对象
的情况下,
键:值
对由
分隔,
在您的格式中缺失。因此,最终的格式如下:

var obj={“账户级别”:“-”,
“地址”:“—”,
“atm_发行”:“—”,
“阿凡达”:“-”,
“分行”:“—”,
“cnic”:“—”};

控制台日志(obj.cnic)JS数组总是以整数作为索引。如果键是文本,则表示它是一个对象

您可以通过以下方式访问对象

var a = {key1 : "value1", key2 : "value2"};

//METHOD 1
console.log(a.key1);

//METHOD 2
console.log(a['key1']);
这是一个数组

var a = ["value1","value2"];
console.log(a[0]);  

数组/对象的填充方式似乎有点奇怪,请尝试按如下方式创建一个新的数组/对象:

dataArray = Object.assign({}, dataArray);
console.log(console.log(dataArray.cnic));


这是一种痛苦,但我正在使用firebase,并在填充属性之前访问它们。因此,首先我让它们被填充,然后访问它们。

这不是一个数组。它是一个物体。OP的困惑可能源于这种误解。@Lix你能看看我的编辑吗?请给我你的反馈?它不是json语法。它的对象语法。@MehdiBouzidi-很好的编辑!与您的第一个版本相比,这无疑是一个改进:)“在您的情况下,您无法定义这样的数组”,您可以轻松地执行
var arr=[];arr.cnic='foo'。OP不应使用数组,但这是可能的。请在问题中添加
console.log(dataArray.length、dataArray instanceof array、dataArray instanceof Object)的输出虽然您可以向数组添加任意属性,但这是非常不传统的,这就是为什么您会得到这么多混乱的注释和答案。数据实际上是如何添加到阵列的,以及何时/如何不尝试访问它?我认为您是在添加属性之前访问该数组的。这只意味着在控制台中扩展该数组时,而不是在记录该数组时,该属性才存在。操作顺序很可能是:1。日志数组。2.日志属性。3.添加属性。4.如果您不介意也打印
console.log(dataArray.\uuuu proto\uuu)的输出,请检查console.Noman中的数组。因为在控制台中检查对象时,会在展开对象时对其进行计算。到那时,情况可能已经改变了。这就是我要告诉你的,在谈论JavaScript对象时不要使用JSON这个术语。这是错误的,令人困惑的。我同意。已删除。他正在打印日志,未定义,因此格式不适用。数组也是对象。“你使用的语法是如何访问对象。”那么,数组就是对象。如果一个数组有一个属性
cnic
,那么使用
array.cnic
可以很好地工作。毕竟,访问
array.length
也很好。@FelixKling数组是对象这一说法是正确的。我不明白的是第二点
如果一个数组有一个属性cnic,那么使用array.cnic
。。。在本例中,我提供了if do
array.Chelsea
ir返回undefined。数组如何具有属性?我很困惑:-S
var-arr=[];arr.Chelsea='foo'。在您的示例中,
array
没有
Chelsea
属性,它的元素之一是字符串值
'Chelsea'
。“那不一样,”费利克斯克林说,“奇怪,我以前从来没有见过这种情况。”。这是JS的新事物,还是已经存在很长时间了?你有什么链接可以让我读到更多关于这个的信息吗?它已经存在很久了。这不是一件平常的事。我不知道有什么具体的资源可以深入讨论这个问题。通常只是用数组是对象这一事实来解释。对象可以具有任意属性。这有什么帮助?如果
dataArray
没有这样一个属性,那么复制一个不存在的属性是如何使它出现的?但是它是从控制台日志显示的内容中存在的。请参阅。如果无法使用
dataArray.cnic
访问该属性,则复制后将无法访问该属性。我不知道
Object.assign
的内部工作原理,但我的推理是,它可能会解决他面临的这种奇怪故障。好的,当然他不能直接访问这个属性,但是控制台仍然可以看到它。正如我在评论中所说的,这很可能是因为当他们在控制台中扩展值时,它将拥有这些属性。那时他们也可以通过
dataArray.cnic
访问它们。在控制台中尝试以下操作:
var obj1={};控制台日志(obj1);var obj2=Object.assign({},obj1);obj1.foo=42;console.log(obj2)。请注意,展开的
obj1
如何显示属性(即使在我们记录对象时它不可能存在),而
obj2
则不显示。