JavaScript对象如何包含属性(键值对)的数组(带方括号)?

How can a JavaScript object contain an array (with square brackets) of properties (key value pairs)?

本文关键字:数组 方括号 键值对 对象 何包含 属性 JavaScript      更新时间:2023-09-26

我正在AngularJS中使用一些以前的代码,但是我的问题涉及到传递给视图的对象的奇怪发生。我得到的是一个数组的数组。但是,嵌套数组具有键值对。这在我的理解中没有意义。

此外,我相信它会导致我试图制作的自定义过滤器出现问题。一般的模型过滤器可以工作,但是对特定字段的过滤不起作用。我已经在jsfiddle中测试了这个概念,如果数据被格式化为具有属性的对象数组,则它可以正常工作,但试图复制我当前数据输出错误的结构,因为它不是有效的JavaScript。有人能给我点启示吗?

[Array[0], Array[0], Array[0]...]
0: Array[0]
  $$hashKey: "00U"
  firstGroupList: Object
  length: 0
  subTitle: "Capsules"
  title: "Esomeprazole Strontium"
  __proto__: Array[0]
1: Array[0]
  $$hashKey: "01X"
  firstGroupList: Object
  length: 0
  subTitle: "Tablets"
  title: "Salsalate"
  __proto__: Array[0]
2: Array[0]
3: Array[0]
4: Array[0]
...

[title: "title", subTitle: "subTitle"]这样的数组怎么可能存在?

考虑以下内容:

var arr = [1,2,3,4];
var obj = {key: 50, anotherKey: 70};
arr.prop = 'something-something';
obj.prop = 'something-something';
console.log(arr['prop']);
console.log(obj['prop']);

它会输出两次"something-something",内部发生了非常相似的事情——你正在设置一个对象的属性,然后读取它。

但是,区别在于对象的实际类型——arr是Array类型,obj是object类型。请注意,这是而不是我们讨论的变量类型——arr和obj都是"object"类型(您可以使用typeof轻松检查)。对象的类型实际上指的是对象的原型,即该特定变量所基于的对象(对于那些更熟悉OOP的人来说,这类似于您继承的类,除了在这种情况下,它只是从类继承的一个实例,而不是整个新类)。

这里有一篇文章可以帮助你更好地理解原型:http://sporto.github.io/blog/2013/02/22/a-plain-english-guide-to-javascript-prototypes/

回到原始代码,什么时候你会真正注意到arr和obj之间的区别?我首先想到的是JSON:

var strArr = JSON.stringify(arr); // [1,2,3,4]
var strObj = JSON.stringify(obj); // {"key":50,"anotherKey":70,"prop":"something-something"}

因此,如果你在数组上使用prop属性,JSON会"丢失"prop属性——这就是为什么你在设置数组属性时应该小心的一个例子。

最后,如果你想要考虑"prop"属性以及"普通"数组成员,你将如何迭代这个数组?为此,您可以使用For ..in:

for (key in arr) console.log(arr[key]);
/* displays:
1
2
3
4
something-something
*/