2015-09-21 2 views
1

У меня есть объект под названием «команда» с набором вложенных объектов для каждого имени команды. В этом имени команды у меня есть игроки, и я ищу, чтобы сортировать каждый массив динамически, а не делать это для каждой команды .xxxx.player.sort();Сортировка массива, вложенного в объект, который вложен в другой объект

var team = { 
    fnatic: { 
     team: "Fnatic", 
     player: ["Olofmeister", "JW", "Pronax", "Krimz", "Flusha"] 
    }, 
    titan: { 
     team: "Titan", 
     player: ["Ex6Tenz", "shox", "RpK", "SmithZz", "Maniac"] 
    }, 
    nip: { 
     team: "Ninjas in Pyjamas", 
     player: ["GeT_RiGhT", "f0rest", "allu", "friberg", "XizT"] 
    }, 
    nv: { 
     team: "EnVy Us", 
     player: ["kennyS", "apeX", "NBK-", "Happy", "kioShiMa"] 
    }, 

    vp: { 
     team: "Virtus Pro", 
     player: ["PashaBiceps", "Taz", "byali", "Snax", "Xx"] 
    } 
}; 

Я пытаюсь сортировать массив игроков в алфавитном порядке (team.XXXX.player). Я обнаружил, что я могу сделать это, набрав

team.fnatic.player.sort(); 

для каждой отдельной команды, но я хочу итерацию над объектом, потому что у меня будет большое количество команд с игроками для сортировки.

Благодаря Arne Martin Aurlien on his blog and his object sort function это так близко, как я пришел с тем, что я искал и читал здесь:

for (var obj in team) { 
    if (team.hasOwnProperty(obj)) { 
     console.log(obj, team[obj].player); //line 107 
     [obj].player = sortObj(team[obj].player); 
     console.log(obj, team[obj].player); //line 109 
    } 
} 

Это, к сожалению, до сих пор только выводит несортированный массив:

fnatic ["Olofmeister", "JW", "Pronax", "Krimz", "Flusha"] script.js:107 
fnatic ["Olofmeister", "JW", "Pronax", "Krimz", "Flusha"] script.js:109 
titan ["Ex6Tenz", "shox", "RpK", "SmithZz", "Maniac"] script.js:107 
titan ["Ex6Tenz", "shox", "RpK", "SmithZz", "Maniac"] script.js:109 
...etc for each team 

Я чувствую, что мне здесь что-то не хватает. Может ли кто-нибудь помочь мне?

+0

Я считаю, что функция 'sort' не изменяет исходные значения. Если это ваше желаемое поведение, вам нужно будет назначить вывод '.sort()' обратно в объект – ochi

ответ

1

Использование Array.prototype.forEach по клавишам команды:

Object.keys(team).forEach(function(key) { 
    team[key].player.sort(); 
}); 

Сортировка на месте (mdn):

Рода() метод сортирует элементы массива на месте и возвращает массив , Сорт не обязательно стабильный. Порядок сортировки по умолчанию соответствует строковым кодам Unicode.

+0

Ах красиво, это сработало отлично. –

+0

Добро пожаловать: -P –

1

Я думаю, вы неправильно поняли, что делал Арне Мартин Аурлиен, когда он написал эту функцию.

Он хотел, чтобы сортировать свойства объекта, а не массив внутри объекта. То, что он пытался сделать, не соответствует дизайну, поскольку спецификация ECMAScript говорит, что свойства объекта не индексируются.

Как вы можете видеть на своем посту, он говорит:

Будьте осторожны при использовании этого с Chrome. Если ваш объект имеет как номера, так и строки в качестве ключей, Chrome сначала сортирует объект с помощью цифровых клавиш, даже если сортировка по значению.

И это не ошибка, поскольку в спецификации четко сказано, что то, что он пытался сделать, не может быть сделано.


Резерв на ваш вопрос, что вы хотите сделать: Сортируйте массив внутри объекта.

Итак, вы уже были почти там.Ваш код должен быть что-то вроде этого:

for (var obj in team) { 
    if (team.hasOwnProperty(obj)) { 
     console.log(obj, team[obj].player); 
     team[obj].player.sort(); // you only need to call the sort method here 
     console.log(obj, team[obj].player); 
    } 
} 

Если я прав, то, что вы не получаете, когда пытаются понять, что происходит, является то, что вы можете получить свойства объекта в JavaScript, и по вызывая его напрямую (например, team.fnatic.player) и вызывая его по строке (например, team['fnatic'].player), и именно поэтому вы можете пропустить объект и получить все дочерние объекты, чтобы получить свойство players (которое является массивом), а затем сортировать этот массив.

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