Wie man mit key:value in Javascript umgeht
習慣沉默
習慣沉默 2017-05-19 10:43:49
0
2
818

Ich bin kürzlich auf eine Algorithmusfrage gestoßen, die das Sortieren eines Schlüssel-Wert-Arrays basierend auf den Wertepaaren erfordert (der Wert kann sich hier auf mehrere Zeilen beziehen), was der Logik des Bewertungssystems eines Hotels entspricht.
Name Hygiene Benutzererfahrung Sicherheit
A Wählen Sie aus den ersten drei in Bezug auf Hygiene die zuvor ausgewählten Top drei aus, sortieren Sie sie nach Benutzererfahrung, wählen Sie die ersten beiden nach Benutzererfahrung aus und sortieren Sie sie nach Sicherheit, wählen Sie die ersten aus Bedingungen der Sicherheit.
Endlich diesen ersten Platz ausgeben.
Ich habe das Gefühl, dass sie tatsächlich ähnlich sind, aber ich habe die Informationen und die Kartenfunktion überprüft, kann aber immer noch nicht verstehen, wie das geht. Bitte geben Sie mir einen Rat. (PS: Ich habe natürlich das Gefühl, dass mein Algorithmus nicht schlecht ist, aber jedes Mal, wenn ich auf einen etwas komplizierteren Algorithmus stoße, bin ich verwirrt. Nicht lange nachdem ich die Front-End-Grube betreten habe, habe ich die grundlegenden js-bezogenen Codes durchgesehen.) , bitte helfen Sie mir, Zweifel zu lösen.

習慣沉默
習慣沉默

Antworte allen(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 }
小葫芦

首先你这个是题目还是项目? 如果是真实项目,你可以用上 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)这个函数也是很方便的。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage