JavaScript - 如何按数字字符串对数组进行排序?

时间:2017-02-22 21:48:06

标签: javascript arrays json sorting lodash

我收到这样的数组:

[
    [{"name":"one","team":"------","checked":false,"position":"-"},
     {"name":"two","team":"------","checked":false,"position":"1"}],
    [{"name":"three","team":"------","checked":false,"position":"3"},
     {"name":"four","team":"------","checked":false,"position":"7"}]
]

我希望最终输出如下:

[
    [{"name":"two","team":"------","checked":false,"position":"1"},
     {"name":"four","team":"------","checked":false,"position":"7"}],
    [{"name":"three","team":"------","checked":false,"position":"3"},
     {"name":"one","team":"------","checked":false,"position":"-"}]
]

这意味着数组按第一个子数组中的最大位置值和最小位置值排序,然后是第二个子数组中的第二个最大位置值和第二个最小位置值。如果位置上有“ - ”,则它留在字符串编号之后。

到目前为止,我已经尝试过lodash:

var mergedArray = vm.roundOf4[0].concat(vm.roundOf4[1]);
var count = _.countBy(mergedArray, {position: '-'});

var ascArray = _.cloneDeep(mergedArray);
var descArray = _.cloneDeep(mergedArray);

_.sortByOrder(ascArray, 'position', 'asc');
_.sortByOrder(descArray, 'position', 'desc');

_.times(count.true, ascArray.push(ascArray.shift()));

vm.roundOf4.some(function (array, i) {
    array.some(function (object, j) {

        if (j === 0) {
            vm.roundOf4[i][j] = ascArray[i];

        } else if (j === 1) {
            vm.roundOf4[i][j] = descArray[i];
        }

    });
});

但按功能升序排序并未正确排序位置值,因此它会进行随机排序。我不知道是不是因为position是一个字符串值。

我应该使用数字吗?

2 个答案:

答案 0 :(得分:0)



// get an array of object an return the min index or the max index depending on the parameter max (true => max index, false => min index)
function minMax(arr, max) {
  var index = 0;                                             // assuming the index 0 is the min or max
  for (var i = 1; i < arr.length; i++) {                     // for each other object in the array
    if(arr[index].position == '-')                           // if the position of the object at index index is '-' then assume the index is this i (before starting the comparison, find an item which have a number for its position property)
      index = i;
    else if ((arr[i].position > arr[index].position) == max) // now that the object at index index has a valid position property, make the comparison depending on the argument max
      index = i;
  }
  return index;
}

// take an two dimensional array and rearrange it
function reArrange(arr) {
  var simple = arr.reduce(function(acc, a) {                 // first let's make the two dimensional array into a one dimensional array
    return acc.concat(a);
  }, []);
  
  var result = [];                                           // the result array
  while(simple.length) {                                     // while there is element in the one dimensional array
    var min = minMax(simple, false);                         // get the min index
    var max = minMax(simple, true);                          // get the max
    result.push([                                            // push the items at the min and max indexes as a sub-array of the result array
      simple.splice(min, 1)[0],                              // splice to remove it from simple array as well
      simple.splice((max < min)? max: max - 1, 1)[0]         // if max index is after min index then substract one because the above splice shrank the array 
    ]);
  }
  return result;
}



var arr = [
    [{"name":"one","team":"------","checked":false,"position":"-"},
     {"name":"two","team":"------","checked":false,"position":"1"}],
    [{"name":"three","team":"------","checked":false,"position":"3"},
     {"name":"four","team":"------","checked":false,"position":"7"}]
];

console.log(reArrange(arr));
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您可以使用排序内部数组,然后再分配给结果并再次排序。

&#13;
&#13;
var data = [[{ "name": "one", "team": "------", "checked": false, "position": "-" }, { "name": "two", "team": "------", "checked": false, "position": "1" }], [{ "name": "three", "team": "------", "checked": false, "position": "3" }, { "name": "four", "team": "------", "checked": false, "position": "7" }]],
    result = [];

data.forEach(function (a) {
    a.sort(function (a, b) { return (+b.position || Number.MIN_VALUE) - (+a.position || Number.MIN_VALUE); });
});

data.forEach(function (a, i) {
    a.forEach(function (b, j) {
        result[j] = result[j] || [];
        result[j][i] = b;
    });
});

result.forEach(function (a) {
    a.sort(function (a, b) { return (+a.position || Number.MAX_VALUE) - (+b.position || Number.MAX_VALUE); });
});

console.log(result);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;