расставить в порядке убывания
есть два массива:
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"]; никак не получается сформулировать код, помогите, хотя бы словами подскажите. |
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); }; }; |
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); |
aiky,
а если в первом массиве есть одинаковые значения? |
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)? ..в порядке следования ,по алфавиту или еще как? ..это к тому что неявно |
Цитата:
<!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, я не оцениваю как плох/хорош... Просто еще один вариант. А там пусть берут любой. :)
|
Ещё вариант...
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); |
рони, лаконично, жаль только что сортировка делается дважды. Мой вариант:
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. |