使用位置对数组进行排序

时间:2015-08-11 10:16:39

标签: javascript jquery arrays

我有一个数组如下。

var FruitArr = [5, "Mango", 3, "Apple", 2, "Lychee", 1, "Banana", 4, "Pineapple"];

如何根据前面的数字对水果名称进行排序并添加到空数组中?该数组已存储为position , item

预期输出

var newFruitArr = ["Banana", "Lychee", "Apple", "Pineapple", "Mango"];

编辑:

显示项目的原因如下:在我的实际代码中,水果名称是base64 url​​字符串,它是动态创建的。 base64创建取决于图像。因此,我想不出更好的方法将url字符串添加到数组中。所以我将数组添加到数组中作为“所需位置”,“base64字符串”。所有转换完成后我都想过对它们进行排序。由于上述原因,我确实使用了.splice()因预期无法正常工作。

4 个答案:

答案 0 :(得分:2)

这是否符合您的需要?

function sort (arr) {
    var min, minId = -1, output = [];

    while (arr.length >= 2) {
        for (var i = 0; i < arr.length; i += 2) {
            if (arr[i] < min || minId == -1) {
                minId = i;
                min = arr[i];
            }
        }
        output.push(arr[minId + 1]);
        arr.splice(minId, 2);

        minId = -1;
    }

    return output;
}

搜索最小数字,将相应的水果推送到输出并从输入数组中删除该对,直到其中没有任何内容。非常简单,肯定不是最有效的解决方案。

答案 1 :(得分:2)

无需排序,您的输入数组中已有索引。

只需预先分配新阵列并填写即可。

var fruits = [2, "apple", 1, "orange"],
    fruitsLength = fruits.length;

var newFruitArr = new Array(fruitsLength / 2);
for (var i = 0; i < fruitsLength; i += 2)
    newFruitArr[fruits[i] - 1] = fruits[i + 1];

答案 2 :(得分:1)

您必须使用sort方法将数组转换为易于使用的表单。

以下是执行此操作的代码:

var result = [];
FruitArr.forEach(function (el, i) {
    if (i % 2) result.push({value: el, weight: FruitArr[i-1]});
});

结果数组将是:

[{value: "Mango", weight: 5}, {value: "Apple", weight: 3}, {value: "Lychee", weight: 2}, {value: "Bananna", weight: 1}, {value: "Pineapple", weight: 4}];

易于使用sort方法排序。

答案 3 :(得分:1)

由于性能问题,我实际上更喜欢使用insert-sort-algo对数组进行排序:

var arr = [5, "Mango", 3, "Apple", 2, "Lychee", 1, "Bananna", 4, "Pineapple"];
var groups = [];

for(var f=0; f < arr.length; f+=2)groups.push([arr[f],arr[f+1]]);

function insertion_sort(array){
  for(var o=1; o < array.length;o++){
    for(var i=o; i>0 && array[i][0] < array[i-1][0];i--){
       var tmp = array[i];
       array[i] = array[i-1];
       array[i-1] = tmp;
    }
  }
  return array;
}

insertion_sort(groups); // [[1, "Bananna"], [2, "Lychee"], [3, "Apple"], [4, "Pineapple"], [5, "Mango"]]