Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   расставить в порядке убывания (https://javascript.ru/forum/misc/22006-rasstavit-v-poryadke-ubyvaniya.html)

qwertyuiop10 02.10.2011 23:29

расставить в порядке убывания
 
есть два массива:
ss1=[18,74,6,9,32,1];
ss2=["width","none","color","border","after","div"];
число первого означает, сколько раз использовано слово из второго массива в тексте. Например ss2[3] повторяется ss1[3] раз, тоесть шесть.
Мне нужно расставить эоементы второго массива так, чтобы на первом месте стояли самые употребляемые слова, тоесть получился такой массив:
ss3=["none","after","width","border","color","div"];
никак не получается сформулировать код, помогите, хотя бы словами подскажите.

Sweet 03.10.2011 00:32

var ss1=[18,74,6,9,32,1],
    ss2=["width","none","color","border","after","div"];

alert( getSorted(ss1, ss2) );

function getSorted(array1, array2){
  return sort( array1.slice(), array2.slice(), [] );

  function sort(array1, array2, result){
    if( array1.length == 0 ) return result;
    var index = array1.indexOf( Math.max.apply( Math, array1 ) );
    array1.splice( index, 1 );
    result.push( array2.splice( index, 1 ) );
    return sort(array1, array2, result);
  };
};

aiky 03.10.2011 21:54

var tmp = {};
for(var i = 0; i < ss1.length; i++) tmp[ss1[i]] = ss2[i];
ss1.sort();
ss3 = [];
for(var i = 0; i < ss1.length; i++) ss3.push(tmp[ss1[i]]);
delete(tmp);

qwertyuiop10 04.10.2011 09:17

aiky,
а если в первом массиве есть одинаковые значения?

aiky 04.10.2011 10:40

qwertyuiop10,
По факту - их нет.
Согласен что вполне могут быть, выход "навскидку" - значения временного хэша помещать в массив:

var tmp = {};
for(var i = 0; i < ss1.length; i++){
  if(!tmp[ss1[i]])  tmp[ss1[i]] = [];
  tmp[ss1[i]].push(ss2[i]);
}
ss1.sort();
ss3 = [];
for(var i = 0; i < ss1.length; i++) 
  for(var j = 0; j < tmp[ss1[i]].length; j++) ss3.push(tmp[ss1[i]][j]);
delete(tmp);


Я предложил принцип, понятно, что для простейшего случая.
Кстати, если есть одинаковые значения - в каком порядке их размещать в массиве(ss3)? ..в порядке следования ,по алфавиту или еще как? ..это к тому что неявно

ksa 04.10.2011 10:51

Цитата:

Сообщение от qwertyuiop10
нужно расставить эоементы второго массива так, чтобы на первом месте стояли самые употребляемые слова

Предложу такой вариант...

<!DOCTYPE html>
<html>
<head>
<!--
<script src="http://code.jquery.com/jquery-latest.js"></script>
-->
<style type="text/css">
</style>
<script type="text/javascript">
function Go() {
	var a1=[18,74,6,9,32,1];
	var a2=["width","none","color","border","after","div"];
	var a=[],o,i
	for (i=0; i<a1.length; i++) {
		o={
			N: a1[i],
			Str: a2[i]
		}
		a[i]=o
	}
	a.sort(function (A,B) {return B.N-A.N}
)
	for (i=0; i<a1.length; i++) {
		alert(a[i].N+'='+a[i].Str)
	}
}
</script>
</head>
<body onload='Go()'>
</body>
</html>

Sweet 04.10.2011 11:10

А чем мой вариант плох?:)

ksa 04.10.2011 11:32

Sweet, я не оцениваю как плох/хорош... Просто еще один вариант. А там пусть берут любой. :)

рони 04.10.2011 11:54

Ещё вариант...
var ss1=[18,74,6,9,32,1];
var ss2=["width","none","color","border","after","div"];
var s = [];
ss1.sort(function(a,b){var a = b-a;s.push(a); return a})
ss2.sort(function(){return s.shift()})
alert(ss2);

ваый 04.10.2011 12:21

рони, лаконично, жаль только что сортировка делается дважды. Мой вариант:
var ss1 = [18, 74, 6, 9, 32, 1],
    ss2 = ["width", "none", "color", "border", "after", "div"];

function getSorted(keys, values) {
    var tmp = {},
        i, l = keys.length;

    for (i = 0; i < l; i++) {
        tmp[values[i]] = keys[i];
    }

    return values.sort(function(a, b) {
        return tmp[b] - tmp[a];
    });
}

alert(getSorted(ss1, ss2));


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