2015-08-11 3 views
1

У меня есть массив, как показано ниже.Сортировка массива с использованием позиций

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

Как я могу сортировать имена фруктов в соответствии с числом перед ним и добавлять в пустой массив? Массив хранится как position , item.

Ожидаемого выход

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

EDIT:

Причина, по которой элементы, как показано на рисунке: В моем фактическом коде плодовых имена base64 URL строка, которая создается на лета. Создание base64 зависит от изображения. Поэтому я не мог придумать лучшего способа добавления строк url ​​в массив. Поэтому я добавил элементы в массив как «желаемая позиция», «base64 string». Я думал о том, чтобы отсортировать их, как только все преобразования сделаны. Я использовал .splice(), который не работал должным образом из-за вышеуказанной причины.

+1

Почему вы используете массив для такого рода данных вместо объекта JSON? Если вы измените свой FruitArr на «{» 5 »:« Манго »,« 3 »:« Яблоко »,« 2 »:« Личи »,« 1 »:« Бананна »,« 4 »:« Ананас »}; он может работать как в этом [ответе] (http://stackoverflow.com/questions/5467129/sort-javascript-object-by-key) – Schlangguru

+0

Это довольно сумасшедший способ сохранить этот массив, я ожидал бы чего-то большего '[{position: 5, item:" Mango "}, {position: 2, item:" Apple} ... и т. д.] ' – Starscream1984

ответ

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]; 
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 методом.

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

Я предпочитаю вставки-сортировки алго для сортировки массива из-за проблем с производительностью:

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"]] 
Смежные вопросы