背景:最近一朋友面试,二面机试题,题目大意是:

从百度天气的一个api取得天气数据,前端展示天气数据,穿衣指数,点击温度栏进行一个升温降温排序,以及不排序
接口地址:http://api.map.baidu.com/telematics/v3/weather?location=深圳&output=json&ak=lsTdWpHKKx2j4m1LhfDDXUgW

看着确实没什么难度,但是最后涉及排序的时候还是有一点值得思考的.
首先我们看看从百度拿到了什么数据

var data=[{date: "周一 03月02日 (实时:9℃)",dayPictureUrl: "http://api.map.baidu.com/images/weather/day/yin.png",nightPictureUrl:"http://api.map.baidu.com/images/weather/night/zhongyu.png",weather: "阴转中雨",wind: "西北风微风",temperature: "11 ~ 8℃",des: "建议着厚外套加毛衣等服装。年老体弱者宜着大衣、呢外套加羊毛衫。"},{date: "周二",dayPictureUrl: "http://api.map.baidu.com/images/weather/day/zhongyu.png",nightPictureUrl:"http://api.map.baidu.com/images/weather/night/xiaoyu.png",weather: "中雨转小雨",wind: "无持续风向微风",temperature: "9 ~ 7℃",des:"不宜洗车,未来24小时内有雨,如果在此期间洗车,雨水和路上的泥水可能会再次弄脏您的爱车。"},{date: "周三",dayPictureUrl: "http://api.map.baidu.com/images/weather/day/xiaoyu.png",nightPictureUrl: "http://api.map.baidu.com/images/weather/night/yin.png",weather: "小雨转阴",wind: "无持续风向微风",temperature: "10 ~ 6℃",des:"天气转凉,空气湿度较大,较易发生感冒,体质较弱的朋友请注意适当防护。"},{date: "周三",dayPictureUrl: "http://api.map.baidu.com/images/weather/day/xiaoyu.png",nightPictureUrl: "http://api.map.baidu.com/images/weather/night/yin.png",weather: "小雨转阴",wind: "无持续风向微风",temperature: "11 ~ 9℃",des:"天气转凉,空气湿度较大,较易发生感冒,体质较弱的朋友请注意适当防护。"}]

des是从穿衣指数的数组中拼接来的.现在我们需要对温度低温进行一个排序.看到数据的时候我在想如何对一个对象进行排序,我想到的方法是将温度项提取成一个数组,对提取的数组进行排序,并返回排序后的数组原索引的排序,

简单说来就是我现在有个数组[4,12,9,22,8]进行升序排序后的数组为[4,8,9,12,22],排序之后的数组索引排序为[0,4,2,1,3]

我们只要拿到排序好的索引,按照索引数组对天气数组进行一个重排就可以了
所以第一步将最低温度抽离出来

 var tArr = [];data.forEach(el => {tArr.push(parseInt(el.temperature.match(/\b\d℃$/)[0]));});

现在tArr的值是[8,7,6,9]
如何将tArr排序,并返回tArr排序后的数组是关键一步
我的做法是将tArr构造成一个每个元素以索引值为属性名的对象的数组(好拗口)其实就是这样的一个数组

[ { '0': 8 }, { '1': 7 }, { '2': 6 }, { '3': 9 } ]
//方法
var structArr=[]
tArr.forEach((el,ind)=>{//构造数据var obj={}obj[ind]=elstructArr.push(obj)
})

然后对元素对象进行排序,这里我采用的是快速排序

 function sortData(arr){if(!Array.isArray(arr))return;if(arr.length<=1) return arr;var mInd=Math.floor(arr.length/2)//中间索引var mVal=arr.splice(mInd,1)[0]//中间值var left= [],right=[];arr.forEach((el,ind)=>{if(Object.values(el)[0]>Object.values(mVal)[0]){left.push(el)}else{right.push(el)}})return sortData(left).concat(mVal,sortData(right))}

将structArr排序

var sortedArr=sortData(structArr)
//排序结果为[ { '3': 9 }, { '0': 8 }, { '1': 7 }, { '2': 6 } ]

最后我们只需要把索引值取出来组成一个新的数组即可

function getSortedInd(arr){if(!Array.isArray(arr))return;var indArr=[]arr.forEach(el=>{indArr.push(Object.keys(el)[0])})return indArr
}
var sortedInd=getSortedInd(sortedArr)  //结果[ '3', '0', '1', '2' ]

获得索引排序后,对天气数据就可以排序了

var sortedData=[]
sortedInd.forEach(el=>{
sortedData.push(data[el])
})

js排序数组并返回排序后原数组的索引排序相关推荐

  1. Python使用numpy函数vsplit垂直(行角度)拆分numpy数组(返回拆分后的numpy数组列表)实战:垂直拆分二维numpy数组、split函数垂直拆分二维numpy数组

    Python使用numpy函数vsplit垂直(行角度)拆分numpy数组(返回拆分后的numpy数组列表)实战:垂直拆分二维numpy数组.split函数垂直拆分二维numpy数组 目录

  2. Python使用numpy函数hsplit水平(按列)拆分numpy数组(返回拆分后的numpy数组列表)实战:水平(按列)拆分二维numpy数组、split函数水平(按列)拆分二维numpy数组

    Python使用numpy函数hsplit水平(按列)拆分numpy数组(返回拆分后的numpy数组列表)实战:水平(按列)拆分二维numpy数组.split函数水平(按列)拆分二维numpy数组 目 ...

  3. 数组方法中会更改原数组,不会更改原数组(详细)

    1.不会改变原来数组的有: concat() 连接两个或更多的数组,并返回结果.  如果arr.concat()里面不放数组参数,则会浅拷贝arr 如果参数不是数组,它不会递归到嵌套数组参数中 数据类 ...

  4. 重写数组的方法(改变原数组)

    下图是我自我学习模拟数组时总结的一些重新数组的方法: 本文我们暂不讨论不改变原数组的方法,只谈改变原数组用到的 6 种方法. 改变原数组的方法 push() 按参数顺序向数组尾部添加元素,返回新数组的 ...

  5. 数组方法中,会改变原数组、不会改变原数组的方法有哪些?

    会改变原数组: 1 添加元素类:(返回新的长度) push() 把元素添加到数组尾部 unshift() 在数组头部添加元素 2 删除元素类:(返回的是被删除的元素) pop() 移除数组最后一个元素 ...

  6. 数组常用方法:是否改变原数组

    改变原数组的: shift:将第一个元素删除并且返回删除元素,空即为undefined unshift:向数组开头添加元素,并返回新的长度 pop:删除最后一个并返回删除的元素 push:向数组末尾添 ...

  7. js 数组操作方法(不改变原数组与改变原数组方法)

    一: 不改变原数组的方法 1. concat() 方法用于连接两个或多个数组 let a =[1,2,3], b=[4,5,6]; let c = a.concat(b); console.log(a ...

  8. js中数组方法不会影响原数组的方法

    不会改变原数组方法: concat(),用于连接两个或多个数组: every().用于检测数组 所有元素是否都符合原始数组: filter(),创建一个新的数组,新数组的元素是通过检查指定数组中符合条 ...

  9. 将一个任意整数插入到已排列的整型数组中,插入后,数组中的数仍保持有序

    /*** * 实现思路:创建一个数组,数组是有序的,使用要插入的数,循环比较找出第一个比这个数大的数,* 元素的下\n标,并保存,新建一个数组,长度为原数组长度+1,循环数组,判断每一项的下标是否小于 ...

最新文章

  1. 为什么医学影像AI已进入「后深度学习时代」?
  2. [New Portal]Windows Azure Virtual Machine (8) Virtual Machine高可用(上)
  3. 20145324 20145325 《信息安全系统设计基础》实验三
  4. 飞飞php2.8采集失败_飞飞影视系统火车头采集器采集发布免登录接口
  5. Django(part11)--MTV模式及模板
  6. USACO2.1【bfs,排序,贪心,dfs,位运算】
  7. halcon 将数据保存到excel_pandas筛选、合并、批量保存excel数据
  8. 下列服务使用的默认端口:ftp,ssh,telnet,dhcp,mail,pop3,smtp,dns,http,sm
  9. [转]B树(多向平衡查找树)详解
  10. robot frame基础知识--变量
  11. Socket.io详解
  12. 软中断SOFTIRQ
  13. 字符串匹配代码C语言,KMP字符串匹配算法C语言实现
  14. 张小龙讲座_微信背后的产品观(20120724)
  15. 浅谈jQuery WeUI框架
  16. 管螺纹如何标注_【专业知识】一次搞全所有螺纹常识,很基础
  17. 在阿里云开源镜像站中下载centOS7
  18. 模拟与仿真两个词的区别
  19. Datawhale组队学习周报(第046周)
  20. 专业解读:从央行征信系统看你的哪些行为会影响你的信用

热门文章

  1. 五天入门SpringBoot(3)--controller、service、serviceImplement、mapper(DAO)的基本概念
  2. 题解:洛谷P1706全排列问题
  3. 第五届上海燕博会(燕窝展、滋补品展)——裂变流量,创造新商业发展机遇
  4. 关于python的指针(演示)
  5. 1.18链界观区块链资讯
  6. vc6编译出小体积pe文件
  7. python%表示什么意思_python中%代表什么意思?
  8. 刷脸支付投入小利润可观大众认知度高
  9. Linux 搭建Kafka集群,最新教程,细到极致
  10. 蓝光森林助力企业应对限电,建设绿色节能数据存储模式