Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите с масивами пожалуйста (https://javascript.ru/forum/misc/45672-pomogite-s-masivami-pozhalujjsta.html)

BorisBritva 11.03.2014 04:55

Помогите с масивами пожалуйста
 
Есть массив - 5,5,5,3,3,3,3,3,2,2,2,2,1,1,1,1,1

Как сделать из него другой массив, чтобы каждое из значений осталось только одно с условиями, что чем больше одинаковых значений в данном массиве, тем первее оно стоит. Если каких то из значений одинаковое количество, то первее должно стоять то, которое больше.

Благодарю.

tsigel 11.03.2014 13:43

Для начала создадим карту массива.

var map = {};


Затем положим в эту карту по ключам значений массива количество их повторов.

var arr = [5,5,5,3,3,3,3,3,2,2,2,2,1,1,1,1,1];

for (var i = 0; i < arr.length - 1; i++) {
   if (!map[arr[i]]) {
        map[arr[i]] = 1;
   }
   if (arr[i] == arr[i+1]) {     
     map[arr[i]]++;
   }
}


Создадим массив, в котором будет результат и наполним его.

var result = [];
for (var i in map)
  result.push(i);


Отсортируем массив согласно ваших условий:

result.sort(function (a, b) {

  if (map[a]>map[b]) {
    return 1;
  } else if (map[a]<map[b]) {
    return -1;
  } else if (map[a]==map[b]) {
    return a-b;
  }
   
});


Итого:

var arr = [5,5,5,3,3,3,3,3,2,2,2,2,1,1,1,1,1],
     map = {}, result = [];

for (var i = 0; i < arr.length - 1; i++) {
   if (!map[arr[i]]) {
        map[arr[i]] = 1;
   }
   if (arr[i] == arr[i+1]) {     
     map[arr[i]]++;
   }
}

for (var i in map)
  result.push(parseInt(i));

result.sort(function (a, b) {

  if (map[a]>map[b]) {
    return 1;
  } else if (map[a]<map[b]) {
    return -1;
  } else if (map[a]==map[b]) {
    return a-b;
  }
   
});

alert(result);

рони 11.03.2014 14:18

BorisBritva,
:)
var arr = [5,5,5,3,3,3,3,3,2,2,2,2,1,1,1,1,1], map = {}, result = [];;
arr.forEach(function (a) {
         map[a] ? map[a]++ : map[a] = 1
     });
     result = Object.keys(map);
     result.sort(function (a, b) {
         return map[a] - map[b] || a - b
     });
alert(result)


Часовой пояс GMT +3, время: 04:34.