Comment gérer la clé : valeur en javascript
習慣沉默
習慣沉默 2017-05-19 10:43:49
0
2
856

J'ai récemment rencontré une question d'algorithme, qui nécessite de trier un tableau clé:valeur en fonction des paires de valeurs (la valeur ici peut faire référence à plusieurs lignes), ce qui est la logique du système de notation d'un hôtel.
Name Hygiene User Experience Security
A Parmi les trois premiers classés en termes d'hygiène, sélectionnez les trois premiers sélectionnés précédemment, triez en fonction de l'expérience utilisateur, sélectionnez les deux premiers en fonction de l'expérience utilisateur et triez en fonction de la sécurité, sélectionnez le premier dans termes de sécurité.
Enfin, sortez la première place.
J'ai l'impression qu'ils sont en fait similaires, mais j'ai vérifié les informations et la fonction de carte, mais je n'arrive toujours pas à comprendre comment faire. Veuillez me donner quelques conseils. (ps : j'ai évidemment l'impression que mon algorithme n'est pas mauvais, mais chaque fois que je rencontre un algorithme légèrement plus complexe, je suis confus. Peu de temps après être entré dans la fosse frontale, j'ai parcouru les codes de base liés à js) , s'il vous plaît, aidez-moi à résoudre les doutes.

習慣沉默
習慣沉默

répondre à tous(2)
漂亮男人
// 随机生成数据
// let rand = () => Math.floor(Math.random() * 100)

// let arr = 'ABCDEFG'.split('').map(e => {
//     return {
//         name: e,
//         health: rand(),
//         experience: rand(),
//         security: rand(),
//     }
// })
// console.log(arr)

// 这是随机生成的一组数据
let arr = [ { name: 'A', health: 67, experience: 78, security: 88 },
  { name: 'B', health: 14, experience: 40, security: 32 },
  { name: 'C', health: 91, experience: 31, security: 64 },
  { name: 'D', health: 7, experience: 64, security: 26 },
  { name: 'E', health: 68, experience: 69, security: 77 },
  { name: 'F', health: 91, experience: 44, security: 43 },
  { name: 'G', health: 61, experience: 44, security: 68 } ]

// 排序
let ret = arr
    .sort((a, b) => {
        return b.health - a.health
    })
    .slice(0, 3)
    .sort((a, b) => {
        return b.experience - a.experience
    })
    .slice(0, 2)
    .sort((a, b) => {
        return b.security - a.security
    })
    .shift()

console.log(ret)
// { name: 'E', health: 68, experience: 69, security: 77 }
小葫芦

Tout d'abord, est-ce un sujet ou un projet ? S'il s'agit d'un vrai projet, vous pouvez utiliser le sortBy de lodash pour trier les objets de la liste. lodashsortBy 对列表中的对象进行排序。

假设你的酒店列表模型简化为:

const list = [
  { name: 'foo', a: 3, b: 5, c: 7 }, // 这个是酒店模型,a, b, c就是各个因素的打分
  ...
]

现在需求是把list中的对象先按a排序,再按b排序,再按c排序。 实现起来就是:

let result = _.sortBy(list, o = > o.a); // 先按a排序
result = _.sortBy(list, o => o.b);      // 再按b排序
result = _.sortBy(list, o => o.c);      // 最后按C排序

如果分数是越大越好,那么应该是逆序

let result = _.sortBy(list, o = > -o.a); // 先按a逆序排序
result = _.sortBy(list, o => -o.b);      // 再按b逆序排序
result = _.sortBy(list, o => -o.c);      // 再按c逆序排序

像题中所说的,要取出3,2, 1名,那么不需要每次都对全部结果排。

let result = _.sortBy(list, o = > -o.a).slice(3);    // 排好序取三个
result = _.sortBy(list, o => -o.b).slice(2);
result = _.sortBy(list, o => -o.c).slice(1);
result[0]  // 第一名

如果是面试题,还需要完成sortBy这个函数, 可以简单利用Array#sort实现:

function sortBy(list, iterator) {
  return list.slice(0).sort(function(left, right) {
    left = iterator(left);
    right = iterator(right);
    return left < right ? -1 : 1;
  });
}

要注意的是:sortBy要实现成稳定排序, 即两个分数一致的对象,排序前后相对位置要保持不变。
当然直接使用上Array#sort(func)

Supposons que votre modèle de liste d'hôtels soit simplifié comme suit : #🎜🎜# rrreee #🎜🎜#L'exigence actuelle est de trier les objets de la liste d'abord par a, puis par b, et enfin par c. Pour le mettre en œuvre c'est : #🎜🎜# rrreee #🎜🎜#Si plus le score est élevé, mieux c'est, alors il devrait être dans l'ordre inverse#🎜🎜# rrreee #🎜🎜#Comme mentionné dans la question, si vous souhaitez supprimer 3, 2 et 1, vous n'avez pas besoin de trier tous les résultats à chaque fois. #🎜🎜# rrreee #🎜🎜# S'il s'agit d'une question d'entretien, vous devez également compléter la fonction sortBy. Vous pouvez simplement utiliser Array#sort pour l'implémenter : #🎜🎜#. rrreee #🎜🎜#Il convient de noter que sortBy doit être implémenté comme un tri stable, c'est-à-dire que la position relative de deux objets avec le même score doit rester inchangée avant et après tri.
Bien sûr, il est également très pratique d'utiliser directement la fonction Array#sort(func). #🎜🎜#
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal