Bagaimana untuk menangani key:value dalam javascript
習慣沉默
習慣沉默 2017-05-19 10:43:49
0
2
855

Saya baru-baru ini menemui soalan algoritma, yang memerlukan pengisihan tatasusunan kunci:nilai berdasarkan pasangan nilai (nilai di sini boleh merujuk kepada berbilang baris), yang merupakan logik sistem penilaian hotel.
Nama Kebersihan Pengalaman Pengguna Keselamatan
A Daripada tiga kedudukan teratas dari segi kebersihan, pilih tiga teratas yang dipilih sebelum ini, susun berdasarkan pengalaman pengguna, pilih dua teratas berdasarkan pengalaman pengguna, dan susun berdasarkan keselamatan, pilih yang pertama dalam syarat keselamatan.
Akhirnya keluarkan tempat pertama ini.
Saya rasa mereka sebenarnya serupa, tetapi saya telah menyemak maklumat dan fungsi peta, tetapi saya masih tidak faham cara melakukannya. Tolong beri saya nasihat. (ps: Saya jelas merasakan bahawa algoritma saya tidak buruk, tetapi setiap kali saya menghadapi algoritma yang sedikit lebih rumit, saya menjadi keliru. Tidak lama selepas saya memasuki lubang hadapan, saya telah melalui kod asas berkaitan js) , tolong bantu saya Selesaikan keraguan.

習慣沉默
習慣沉默

membalas semua(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 }
小葫芦

Pertama sekali, adakah ini topik atau projek anda? Jika ia projek sebenar, anda boleh menggunakan lodash's sortBy untuk mengisih objek dalam senarai. 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)

Andaikan model senarai hotel anda dipermudahkan kepada: 🎜 rrreee 🎜Keperluan semasa ialah mengisih objek dalam senarai dahulu dengan a, kemudian dengan b, dan kemudian dengan c. Untuk melaksanakannya ialah: 🎜 rrreee 🎜Sekiranya lebih besar skor, lebih baik, maka ia harus dalam susunan terbalik🎜 rrreee 🎜Seperti yang dinyatakan dalam soalan, jika anda ingin memilih 3, 2 dan 1, anda tidak perlu mengisih semua keputusan setiap kali. 🎜 rrreee 🎜Jika ia adalah soalan temu duga, anda juga perlu melengkapkan fungsi sortBy Anda hanya boleh menggunakan Array#sort untuk melaksanakannya: 🎜 rrreee 🎜Perlu diambil perhatian bahawa sortBy mesti dilaksanakan sebagai isihan stabil, iaitu, kedudukan relatif dua objek dengan skor yang sama harus kekal tidak berubah sebelum dan selepas mengisih.
Sudah tentu, ia juga sangat mudah untuk menggunakan fungsi Array#sort(func) secara langsung. 🎜
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan