对任意对象数组进行排序

ranking arbitrary array of objects

本文关键字:排序 数组 任意 对象      更新时间:2023-09-26

如果我有一个像这样的数组

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'}     
 ]

如何编写一个返回元素秩的函数?所以对于这个数组,对于标题为brand的元素,它应该返回0,对于标题为color的元素,它应该返回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 

根据您的进一步解释更新答案

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

如果它已经排序(必须是,否则我真的不明白你的问题),你可以做以下事情

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;
}