为什么我的数组没有以我将对象推入数组的方式排序?

时间:2015-02-05 19:15:20

标签: javascript arrays json

好吧,我对一个javascript数组对象有一个小问题,数组看起来像这样:

var myArray = [
           {Month : 1, Count : 1000},
           {Month : 2, Count : 1000},
           {Month : 9, Count : 1000},
           {Month : 10, Count : 1000},
           {Month : 11, Count : 1000},
           {Month : 12, Count : 1000},
     ]; 

我遇到的问题是我使用这个对象数组来显示数据 到图表。对于我的生活,我已经尝试过每一种我能想到的方式,以我需要的方式重新排序这个数组。需要像这样:

________________________________________________
 09       10       11       12        1        2

因为该图表应该以当前月份的相反顺序显示6个月的数据。我尝试过几件事情,包括:

   Code Updated Below:

调用方法并使用对象数组加载它:

<script>

monthArray = [];
        monthArray.push({"Month" : 1,
            "Count" : 1252});
        monthArray.push({"Month" : 2,
            "Count" : 1252});
        monthArray.push({"Month" : 9,
            "Count" : 1252});
        monthArray.push({"Month" : 10,
            "Count" : 1252});
        monthArray.push({"Month" : 11,
            "Count" : 1252});
        monthArray.push({"Month" : 12,
            "Count" : 1252});

sTest(monthArray);
</script>

重新给了我同样的结果:::

   Updated Below:

现在我在常规html文件中执行此操作以进行测试。 没有好办法做到这一点,我会尝试另一种方式,但说实话,我不知道其他任何方式。

作为参考,这段代码的第二部分必须保持原样,除非有人知道将json对象加载到这种形式的数据中的更好方法,基本上它只是模仿我正在做的转换我的json对象所以我可以有效地重命名月份和数据,然后将它们加载到我正在使用的d3.js条形图中。

提前致谢。

编辑:

我最近尝试编辑代码来连接两个数组并显示连接数组但仍然收到相同的结果。这是新的代码:

<script>
var sTest = function(array) {

    var newArray = [];
    var newArray2 = [];
    var currentMonth = 2;
    var index = -1;

    //loop through the array to grab the index of the current date to set 
    //my starting and ending points for loading the new array
    for (i = 0; i < array.length; i++) {
        document.write(array[i].Month + "<br/>");
        if (array[i].Month === currentMonth) {
            index = i;
        }
    }

    //test the index of the current date
    document.write("The index of the current date is: " + index + "<br/>");

    //test the length just to be sure and avoid out of bounds errors
    document.write("The length of the current array is: " + array.length + "<br/>");

    //Get the data after the current month and load it to the array first
    for (j = index + 1; j < array.length; j++) {
        newArray.push({"Month" : array[j].Month, "Count" : array[j].Count});
    }    

    //get the data up to the current month and load it into the new array last
    for (k = 0; k <= index; k++) {
        newArray2.push({"Month" : array[k].Month, "Count" : array[k].Count});
    }

    var finalArray = newArray.concat(newArray2);

    //test the printout of the new array to examine the results
    for (i = 0; i < finalArray.length; i++) {
        document.write("Month: " + array[i].Month + " Count: " + array[i].Count + "<br/>");
    }

};
</script>

这是同样的结果:

1
2
9
10
11
12
The index of the current date is: 1
The length of the current array is: 6

Month: 1 Count: 1252
Month: 2 Count: 1252
Month: 9 Count: 1252
Month: 10 Count: 1252
Month: 11 Count: 1252
Month: 12 Count: 1252

3 个答案:

答案 0 :(得分:1)

如果您可以稍微改变一下数组,这里有一个解决方案:

  1. 在名为Order的对象中添加新参数。
  2. &#34;修正&#34;月份并将其分配给订单(因为当前月份将是最后一个月,任何具有较高价值的月份都是上一年,将其值减少12)。
  3. 按新订单值对数组排序。
  4. 代码如下:

    var date = new Date();
    var currentMonth = date.getMonth()+1; // months go from 0 to 11, but your code is 1-12
    
    // add the new ordering parameter
    for (var x = 0; x < myArray.length; x++) {
        if (myArray[x].Month > currentMonth) {
            myArray[x].Order = myArray[x].Month - 12;
        } else {
            myArray[x].Order = myArray[x].Month;
        }
    }
    
    // sort the array using the new Order value
    myArray.sort(function compare(a,b) {
                  if (a.Order < b.Order)
                     return -1;
                  else
                     return 1;
                });
    

    您可以在此处看到它:http://jsfiddle.net/ypp9kc9y/


    这里有一个&#34;清洁工&#34;将所有这些合并到比较函数中的解决方案,并且不需要其他变量:

    // sort the array using the new Order value
    myArray.sort(function compare(a,b) {
              var date = new Date();
              var orderA = a.Month > date.getMonth()+1 ? a.Month -12 : a.Month;
              var orderB = b.Month > date.getMonth()+1 ? b.Month -12 : b.Month;
              if (orderA < orderB)
                 return -1;
              else
                 return 1;
            });
    

    在此处查看:http://jsfiddle.net/ypp9kc9y/1/

答案 1 :(得分:1)

你的问题就在这里:

//test the printout of the new array to examine the results
for (i = 0; i < finalArray.length; i++) {
    document.write("Month: " + array[i].Month + " Count: " + array[i].Count + "<br/>");
}

您正在循环浏览finalArray.length,但您的document.write正在使用array[i] 而非 newArray[i] - 您正在循环使用原始未经修改的数组。

答案 2 :(得分:0)

查看JavaScript中date object的属性。如果您使用日期数学而不是整数数学,那么1/15将在12/14之后出现。