我有一个数组如下。
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()
因预期无法正常工作。
答案 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"]]