登录

javascript中的key:value这种东西该怎么处理

最近遇到了一个算法题,要求对一个key:value这样的数组,根据value值对对key进行排序(这里的value值可以指多行),一个酒店的评分系统的逻辑。
名称 卫生 用户体验 安全性
A x1 y1 z1
B x2 y2 z2
... ... ... ...
类似于上面的这样子的,然后先对卫生排序,卫生排完,选出卫生排序得出的前三名,选择前面选出的前三民,根据用户体验排序,选出用户体验前两名,根据安全性排序,选出安全性的第一名。
最后输出这个第一名。
感觉其实都差不多,但是资料也查过,map函数也看了,但是还是理解不了到底该怎么搞,求大佬赐教一波。(ps:明明感觉自己算法算不上差啊,可是每次遇到稍微复杂一点的算法就被搞晕了,刚入前端坑不久,基本的js相关的代码都撸过一遍),求大佬解惑。

# JavaScript
習慣沉默習慣沉默2024 天前477 次浏览

全部回复(2) 我要回复

  • 漂亮男人

    漂亮男人2017-05-19 10:45:49

    // 随机生成数据
    // 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 }

    回复
    0
  • 高洛峰

    高洛峰2017-05-19 10:45:49

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

    回复
    0
  • 取消回复发送