2013-05-16 2 views
-1

Если у меня есть массив как этотрейтинг произвольного массива объектов

var cars= 
[ 
     { 'title':'brand', 'value':'honda'} 
     { 'title':'brand', 'value':'toyota'} 
     { 'title':'color', 'value':'red'} 
     { 'title':'color', 'value':'white'} 
     { 'title':'year', 'value':'1995'} 
     { 'title':'year', 'value':'2006'} 
     { 'title':'year', 'value':'2007'}  
] 

Как я могу написать одну функцию, которая будет возвращать ранг элемента. Итак, для этого массива для элементов с названием «бренд» он должен возвращать 0, поскольку элементы с заголовком «цвет» должны возвращать 1 и так далее. Он не должен кэшировать или использовать таблицу сопоставления, но должен определить ранг на полете, поэтому в любое время вы звоните

getRank(cars[6]) == 2 //true for the last element 
getRank(cars[0]) == 0 //true for the first element 
getRank(cars[1]) == 0 //true for the second element 
getRank(cars[3]) == 1 //true for the fourth element 
+0

Пожалуйста, объясните вашу проблему более подробно. что ты уже испробовал? В чем была проблема с вашим решением? У вас есть jsfiddle, который может продемонстрировать проблему? – Xotic750

+0

Действительно ли вы хотите, чтобы цвет возвращался «-1» или «1»? – Xotic750

+0

Прошу прощения за путаницу ... Правила грамматики смешения с математической ноте плохи – Agzam

ответ

0

Если он уже заказал (это должно быть причиной в противном случае я бы на самом деле не понимаю вашу проблему) вы могли бы сделать что-то вроде следующего

var current_index = -1; 
var current_title = ""; 

for (var i in arr) { 
    if (arr[i].title!=current_title) { 
     current_title = arr[i].title; 
     current_index++; 
    } 
    arr[i].rank = current_index; 

} 
+0

Не использовать для in для итерации массива. http://stackoverflow.com/questions/500504/why-is-using-for-in-with-array-iteration-such-a-bad-idea – Xotic750

+0

В этом случае это не имеет значения :) – androidavid

+0

Возможно, в этом нет , но даже вы должны рассмотреть вопрос о сохранении вашей петли с помощью'if (array.hasOwnProperty (i)) {...} 'См. «for Statement»: http://javascript.crockford.com/code.html – Xotic750

2

Обновленный ответ, основанный на ваших дальнейших объяснений

Javascript

var cars = [ 
     { 'title':'brand', 'value':'honda'}, 
     { 'title':'brand', 'value':'toyota'}, 
     { 'title':'color', 'value':'red'}, 
     { 'title':'color', 'value':'white'}, 
     { 'title':'year', 'value':'1995'}, 
     { 'title':'year', 'value':'2006'}, 
     { 'title':'year', 'value':'2007'}  
]; 

function getRank(data, number) { 
    var ranks = {}, 
     rank = 0; 

    data.forEach(function (entry) { 
     if (typeof ranks[entry.title] !== "number") { 
      ranks[entry.title] = rank; 
      rank += 1; 
     } 
    }); 

    return ranks[data[number].title]; 
} 


console.log(getRank(cars, 6)); 
console.log(getRank(cars, 0)); 
console.log(getRank(cars, 1)); 
console.log(getRank(cars, 3)); 

На jsfiddle

Выход

2 
0 
0 
1 
+0

Я сказал произвольный ... – Agzam

+0

Произвольный - «Основываясь на случайном выборе или личной прихоти, а не на любой причине или системе» – Xotic750

+0

вы не получите ... «вот так» означает именно этот конкретный массив. Мне нужно решение, которое работает для любого массива объектов, где каждый объект имеет свойство «title» – Agzam

Смежные вопросы