Javascript - 向现有阵列添加新标签和数据

时间:2016-01-29 22:08:13

标签: javascript arrays

据我所知,可以将更多数据推送到数组中。 Fe,我有一个阵列:

G = [12, 34, 5]. 

现在,我可以像这样访问第n个元素:

G[n]

我现在想用标签推送新数据,所以我希望数组看起来像

G = [12, 34, 5, label:567856, other: Infinity]

我可以通过致电

获得567856
G["label"] //(or Infinity by calling G["other"]). How can I achieve this? 

我找到了

G[i].push({
    label:567856, 
    other: Infinity
})

但是这样它将它添加为一个完整的新元素,我只能调用G [4] [“other”],而不是G [“other”]。如何按照我的描述添加元素?

谢谢!

4 个答案:

答案 0 :(得分:2)

要添加到Andriy的答案,您需要使用Javascript对象而不是数组。对象可以具有带自定义名称的索引。例如,给定

<input type="number" id="height" value="5">

你可以做到

var newObj = {"hello": "world", "value":1, "inf": Infinity}

的问题
newObj['hello'] // "world"
newObj['value'] // 1

是你要推送一个具有2个属性的对象,而不是推送2个对象,这就是你需要使用G[i].push({ label:567856, other: Infinity })

的原因

请参阅正在运行JSFiddle example.

答案 1 :(得分:1)

G["other"] = "something";

使用此功能,您将保留原始数组,现在具有属性other,但它不在[12, 34, 5]

使用此方法,您可以将对象添加到数组中:

G.push({other: 123})
console.log(G);//[12, 34, 5, object]
console.log(G[3].other);//123

的问题
G[i].push({
    label:567856, 
    other: Infinity
})

是你推动一个具有2个属性的对象,而不是推送2个对象,这就是为什么你需要使用G [4] [&#34;其他&#34;]

答案 2 :(得分:0)

阵列的设计并不适合您的情况。

请参阅从ECMAScript 262, 5.1 15.4

访问流的数组元素
  

数组对象对某类属性进行特殊处理   名。属性名称P(以String值的形式)是一个数组   index当且仅当ToString(ToUint32(P))等于P和   ToUint32(P)不等于2 ^ 32-1。

因此您无法按字母顺序访问Array元素,因为该键不会被 ToUint32 解析为整数。

您可以将object添加到数组并在推入数组后存储它的索引(Array.prototype.push会返回您的数组大小):

var G = [1,3,4];
var labelIndex = G.push({'label': 123}) - 1;
console.log(G[labelIndex]["label"]);

实际上,当你的数组中有两个或多个具有相同属性的对象时,该解决方案就会出现问题。

以下建议不推荐!

但是,您可以使用下面的代码来定义G数组属性,但它不是数组属性的值,它是数组属性:

G.other = Infinity;
G.label = 567856;
// Access newly created properties
console.log(G["other"]);
console.log(G["label"]);

祝你好运!

答案 3 :(得分:0)

JavaScript中的数组是一种对象。因此,它们可以包含属性:

G.label = 567856;
G.other = Infinity;

数组优于其他对象的优点是它们的索引元素是有序的

如果您希望数组中的第四个和第五个元素为567856Infinity ,那么您希望能够使用{{来引用这些值1}}和G.label,您可以按照以下方式执行此操作:

G.other

您仍然可以使用循环遍历数组:

var G = [12, 34, 5];

G.push(G.label = 567856);     //same as G.label = 567856;  G.push(G.label);
G.push(G.other = Infinity);

请注意,此创建重复项。如果您之后更改了var G = [12, 34, 5]; G.push(G.label = 567856); G.push(G.other = Infinity); G.forEach(function(val) { console.log(val); // 12 ... 34 ... 5 ... 567856 ... Infinity }); console.log(G.label); //567856 console.log(G.other); //InfinityG.label,那么这些更改将反映在数组的第四和第五个元素中。

但是,您可以使用Object.defineProperty()G.otherG.label上创建setter来克服这个问题:

G.other