在Javascript中维护数组顺序

在Javascript中维护数组顺序,javascript,php,arrays,loops,Javascript,Php,Arrays,Loops,我是JavaScript新手,在处理数组时遇到了问题,我希望数组按照我显式编写的方式排序,而不是JavaScript决定它需要的方式排序 如果我们有一个数组 var array = { 0: 'zero', 4: 'four', 2: 'two' }; 当我选择在控制台中显示或遍历它时,它的重新排序如下 array = { 0: 'zero', 2: 'two', 4: 'four' }; 到目前为止,我已经尝试了两个循环,for循环,以及带有

我是JavaScript新手,在处理数组时遇到了问题,我希望数组按照我显式编写的方式排序,而不是JavaScript决定它需要的方式排序

如果我们有一个数组

var array = {
    0: 'zero',
    4: 'four',
    2: 'two'
};
当我选择在控制台中显示或遍历它时,它的重新排序如下

array = {
    0: 'zero',
    2: 'two',
    4: 'four'
};
到目前为止,我已经尝试了两个循环,for循环,以及带有in语句的for循环。 它们都是按照我的设想工作的,因为它们使用一把钥匙,在那里上下工作,我指定的顺序是绝对没有用的

如何按照数组的顺序使用其他语言(如PHP)编写/打印/处理数组

$array = array(
    0 => 'zero',
    4 => 'four',
    2 => 'two'
);

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

0
4
2

提前感谢。

您使用的是对象
{}
,而不是数组
[]
。对象没有显式顺序,而数组有显式顺序。这就是你有问题的原因。将您的
{}
更改为
[]
,您会没事的。您甚至可以使用对象数组

var array = [
    {0: 'zero'}, 
    {4: 'four'}, 
    {2: 'two'}
];
像这样绕过去

for(var i = 0; i < array.length; i++){
  console.log(array[i]);
}
另一个编辑:问题是,您试图创建一个与对象一样具有属性和值的数组,而不使用对象{property:value},这实际上无法用数组完成。要像您希望的那样在数组上循环,只需

var arr = [1,2,3]

for(变量i=0;i

但问题是,就像上面提到的,你需要更复杂的数组,而这是你根本做不到的

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

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

恕我直言,您的错误在于,您似乎认为可以使用索引或成员名称来访问数据,同时作为数据本身的一部分

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

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

var pairs = [
    [0, "zero"],
    [4, "four"],
    [2, "two"]
];
for (var index in pairs) {
    alert(pairs[index][0] + ": " + pairs[index][1]);
};
对于这一个,我将数字和字符串对放在各自的数组中:位置0处的数字,位置1处的字符串。我将这些数组成对存储

然后我用for/in在数组上迭代,在每次迭代中,它给我一个
对的索引

然后,我使用该索引访问成对的右子数组,并从位置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].number
pairs[index].name更清楚:“对于具有给定索引的pairs,请给我编号和名称。”

_

脚注:

[1a]一个数字就是一个数字:我的银行账号就是:一种识别我银行账户的方法。它没有传达任何关于我的名字,我的PIN,或者我账户上的余额的含义——所有符合我银行账户数据条件的属性


[1b]名字就是名字:我的名字就是名字。当你谈论我的时候,你可以用我的名字来指代我,这样别人就会知道你在谈论谁。我的名字并没有传达任何关于我的爱好、我的SSN或我拥有的汽车品牌的信息——所有这些属性都可以作为描述我某些方面的数据。(然而,按照惯例,你通常可以通过名字来判断一个人的性别)

你需要了解什么是an和an,它们是根本不同的东西,行为也不一样

排列

数组是类似列表的对象,其原型具有执行遍历和变异操作的方法。JavaScript数组的长度和元素的类型都不是固定的。由于数组的大小长度在任何时候都会增长或收缩,所以JavaScript数组不能保证密集。一般来说,这些都是方便的特性;但是,如果这些特性对于您的特定用途不可取,您可以考虑使用类型化数组。 数组示例,请注意神奇的
length
属性,分配给数组的值始终位于其索引位置;索引从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;
迭代数组

迭代(枚举)对象

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

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
}
var对象={
"c":1,,
“z”:2,
“b”:3,
“a”:4
}
var propertyOrder=['c','z','b','a'];
对于(var指数=0;指数
它实际上似乎是一个对象。各位,问题是:如何为(数组中的var k)控制台打印
0
然后
4
然后
2
执行
。log(k)
?我已经阅读并回答了下面的所有解决方案,他们没有你所说的下面的答案,我说过要迭代数组,以便按照显式写入的顺序写入/打印/处理它,但还没有人解决这个问题,每个人都在赶时髦,大喊“不是数组,而是对象”,我的问题仍然没有得到回答。@wared Read>以任意顺序迭代对象的可枚举属性。对于每一个不同的本体
// 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;
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
}
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;
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
    }
};
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
}