Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.10.2011, 23:29
Аспирант
Отправить личное сообщение для qwertyuiop10 Посмотреть профиль Найти все сообщения от qwertyuiop10
 
Регистрация: 29.09.2011
Сообщений: 42

расставить в порядке убывания
есть два массива:
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"];
никак не получается сформулировать код, помогите, хотя бы словами подскажите.
Ответить с цитированием
  #2 (permalink)  
Старый 03.10.2011, 00:32
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

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);
  };
};
Ответить с цитированием
  #3 (permalink)  
Старый 03.10.2011, 21:54
Аватар для aiky
Аспирант
Отправить личное сообщение для aiky Посмотреть профиль Найти все сообщения от aiky
 
Регистрация: 06.04.2010
Сообщений: 90

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);
Ответить с цитированием
  #4 (permalink)  
Старый 04.10.2011, 09:17
Аспирант
Отправить личное сообщение для qwertyuiop10 Посмотреть профиль Найти все сообщения от qwertyuiop10
 
Регистрация: 29.09.2011
Сообщений: 42

aiky,
а если в первом массиве есть одинаковые значения?
Ответить с цитированием
  #5 (permalink)  
Старый 04.10.2011, 10:40
Аватар для aiky
Аспирант
Отправить личное сообщение для aiky Посмотреть профиль Найти все сообщения от aiky
 
Регистрация: 06.04.2010
Сообщений: 90

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)? ..в порядке следования ,по алфавиту или еще как? ..это к тому что неявно

Последний раз редактировалось aiky, 04.10.2011 в 11:15.
Ответить с цитированием
  #6 (permalink)  
Старый 04.10.2011, 10:51
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от 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>
Ответить с цитированием
  #7 (permalink)  
Старый 04.10.2011, 11:10
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

А чем мой вариант плох?
Ответить с цитированием
  #8 (permalink)  
Старый 04.10.2011, 11:32
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Sweet, я не оцениваю как плох/хорош... Просто еще один вариант. А там пусть берут любой.
Ответить с цитированием
  #9 (permalink)  
Старый 04.10.2011, 11:54
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Ещё вариант...
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);
Ответить с цитированием
  #10 (permalink)  
Старый 04.10.2011, 12:21
Профессор
Отправить личное сообщение для ваый Посмотреть профиль Найти все сообщения от ваый
 
Регистрация: 29.06.2011
Сообщений: 445

рони, лаконично, жаль только что сортировка делается дважды. Мой вариант:
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));
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как расставить события neon_tmn jQuery 1 24.08.2011 14:53
Обход массива в строгом порядке nibble Общие вопросы Javascript 35 03.12.2010 13:38