在Javascript中维护数组顺序

时间:2014-02-06 15:58:57

标签: javascript php arrays loops

我是JavaScript的新手,我在使用我的数组时遇到问题,我希望我的数组是如何明确地编写的,而不是JavaScript如何决定它是否需要它。

如果我们有一个数组

var array = {
    0: 'zero',
    4: 'four',
    2: 'two'
};

当我选择在控制台中显示它或迭代它时,它会像这样重新排序

array = {
    0: 'zero',
    2: 'two',
    4: 'four'
};

到目前为止,我已经尝试了2个循环,for循环,以及带有in语句的for循环。 两者都按照我的假设,因为他们使用密钥并在那里上下工作,使我指定的顺序绝对没用。

如何编写/打印/使用我的数组作为其命令,在其他语言如PHP中它就像

一样简单
$array = array(
    0 => 'zero',
    4 => 'four',
    2 => 'two'
);

foreach($array as $key => $value)
    echo $key ."\n";

这将输出

0
4
2

提前致谢。

3 个答案:

答案 0 :(得分:4)

您使用的是对象{},而不是数组[]。对象没有明确的顺序,Arrays有。这就是你遇到问题的原因。将您的{}更改为[]即可。你甚至可以使用一组对象。

var array = [
    {0: 'zero'}, 
    {4: 'four'}, 
    {2: 'two'}
];

像这样循环

for(var i = 0; i < array.length; i++){
  console.log(array[i]);
}

给我们正常的订单。

Object {0: "zero"}
Object {4: "four"}
Object {2: "two"} 

另一个编辑:问题是你正在尝试拥有一个像对象一样具有属性和值的数组,而不使用对象{property:value} - 这对于数组来说无法真正完成。要按照你想要的方式遍历数组,它就像

一样简单
var arr = [1,2,3]

for(var i = 0; i < arr.length; i++){
  console.log(i) //1,2,3
}

但问题,如上所述,你想要更复杂的数组,你根本无法做到。

答案 1 :(得分:1)

你需要了解ArrayObject是什么,它们是根本不同的东西,并且行为不一样。

  

阵列

     

数组是类似列表的对象,其原型具有执行遍历和变异操作的方法。 JavaScript数组的长度和元素的类型都不固定。由于数组的大小长度随时增长或缩小,因此不保证JavaScript数组密集。一般来说,这些都是方便的特征;但如果这些功能不适合您的特定用途,您可以考虑使用类型化数组。

数组的示例,请注意神奇的length属性,分配给数组的值始终位于其索引位置; index是0到2 ^ 32 - 1

// dense arrays
var array1 = [1, 2, 3];

array1.length === 3;
array1[0] === 1;

var array2 = [];

array2[0] = 1;
array2[1] = 2;
array2[2] = 3;

array2.length === 3;
array1[1] === 2;

var array3 = [];

array3.push(1);
array3.push(2);
array3.push(3);

array3.length === 3;
array3[2] === 3;

// and a sparse array
var array4 = [];

array4[0] = 1;
array4[2] = 2;
array4[4] = 3;

array4.length === 5;
array4[1] === undefined;

迭代数组for

var array = [1, 2, 3, 4, 5];

for (var index = 0; index < array.length; index += 1) { // counts from (index) 0 to 4
    console.log(index, array[index]); // outputs 0 1 \n 1 2 \n 2 3 \n 3 4 \n 4 5
}
  

对象

     

对象是属性的集合,属性是名称和值之间的关联。属性的值可以是函数,在这种情况下,属性称为方法。除了在浏览器中预定义的对象外,您还可以定义自己的对象。

Object的示例,没有神奇的length属性。

var object1 = {
    'zero': 1,
    'one': 2,
    'two': 3
};

object1.zero === 1;

var object2 = {);

object2['zero'] = 1;
object2['one'] = 2;
object2['two'] = 3;

object2.one === 2;

var object3 = {);

object3.zero = 1;
object3.one = 2;
object3.two = 3;

object['two'] === 3;

迭代(枚举)一个对象for..in

var object = {
   one: 0,
   two: 1,
   three: 2
};

for (var property in object) {
    if (object.hasOwnProperty(property)) { // make sure the property belongs to object
        console.log(property, object[property]); // outputs (not necessarily this order)
                                                 // three 2 \n two 1 \n one 0
    }
};

如果您正在尝试维护一个有序的Object,那么这不是Javascript的工作方式,并且对象的迭代(枚举)是任意的。您可以使用一些技术以已知顺序迭代(枚举)Object。这要求您在数组中保留有序的属性列表,并在迭代过程中使用该数组。

var object = {
   'c': 1,
   'z': 2,
   'b': 3,
   'a': 4
}

var propertyOrder = ['c', 'z', 'b', 'a'];

for (var index = 0; index < propertyOrder.length; index += 1) {
    console.log(index, propertyOrder[index], object[propertyOrder[index]]); // outputs 0 c 1 \n 1 z 2 \n 2 b 3 \n 3 a 4
}

答案 2 :(得分:0)

我不明白。是什么让你认为0,然后4,然后2,是“按顺序”的任何形式或形状?

但是,显然你想要的是将数字和字符串保持在一起,按照你指定的顺序

你的错误,如果你原谅我听起来有些刺耳,那么你似乎认为你可以使用索引或成员名称来一种访问数据的方法和< strong>部分数据本身。

你不能,也不应该。索引是索引,名称是名称,数据是数据 [1]

以下是将数字和字符串保持在一起的两种实现方式:

var pairs = [
    [0, "zero"],
    [4, "four"],
    [2, "two"]
];
for (var index in pairs) {
    alert(pairs[index][0] + ": " + pairs[index][1]);
};

对于这个,我将数字和字符串对保存在它们自己的数组中:位置0处的数字,位置1处的字符串。我将这些数组存储在pairs中。

然后我用for / in迭代数组,在每次迭代中,它给出了我pairs数组的索引。

然后我使用该索引访问pairs中的右子数组,并从位置0获取数字,从位置1获取字符串。

var pairs = [
    {number: 0, string: "zero"},
    {number: 4, string: "four"},
    {number: 2, string: "two"}
];
for (var index in pairs) {
    alert(pairs[index].number + ": " + pairs[index].string);
};

除了将对存储在数组中之外,这个工作原理完全相同,我将它们存储在对象中。

这在for循环中具有更好的可读性:pairs[index][0]pairs[index][1]并没有真正传达明确的含义。它只告诉我们,“对于给定索引的对,得到项目0和1”。

然而,pairs[index].numberpairs[index].name更加清晰:“在给定索引的对中,给我数字和名称。”

_

脚注:

[1a] 一个数字是一个数字:我的银行帐号只是:一种识别我的银行帐户的方法。它不会传达我的姓名,个人识别码或帐户余额的任何含义 - 所有属性都属于我的银行帐户。

[1b] 名称是名称:我的名字只是一个名字。当你在谈论我时,你可以用我的名字来引用我,以便其他人知道你在说谁。我的名字没有传达任何有关我的爱好,我的SSN或我拥有的汽车品牌的信息 - 所有属性都可以作为描述我某些方面的数据。 (但按照惯例,您通常可以通过姓名告诉某人的性别)