比方说有这么一个JSON对象:
{
VdKYUwJK0LX7PjH7AAAB: 'VdKYUwJK0LX7PjH7AAAB',
'52dPDsI8bAJIuVzoAAAC': '52dPDsI8bAJIuVzoAAAC',
QJlU5mYDPXDTXA5vAAAD: 'QJlU5mYDPXDTXA5vAAAD'
}
我想在不知道最后一项K的情况下获取到末尾项的值,请问怎么做?
比方说有这么一个JSON对象:
{
VdKYUwJK0LX7PjH7AAAB: 'VdKYUwJK0LX7PjH7AAAB',
'52dPDsI8bAJIuVzoAAAC': '52dPDsI8bAJIuVzoAAAC',
QJlU5mYDPXDTXA5vAAAD: 'QJlU5mYDPXDTXA5vAAAD'
}
我想在不知道最后一项K的情况下获取到末尾项的值,请问怎么做?
获取到最后一个key,再根据key取值
var lastkey="";
var jsonobj={
VdKYUwJK0LX7PjH7AAAB: 'VdKYUwJK0LX7PjH7AAAB',
'52dPDsI8bAJIuVzoAAAC': '52dPDsI8bAJIuVzoAAAC',
QJlU5mYDPXDTXA5vAAAD: 'QJlU5mYDPXDTXA5vAAAD'
}
for (var keyname in jsonobj){
lastkey=keyname;
}
alert (lastkey);
let obj = {
VdKYUwJK0LX7PjH7AAAB1: 'VdKYUwJK0LX7PjH7AAAB2',
'52dPDsI8bAJIuVzoAAAC1': '52dPDsI8bAJIuVzoAAAC2',
QJlU5mYDPXDTXA5vAAAD1: 'QJlU5mYDPXDTXA5vAAAD2'
}
let lastIndex = Object.keys(obj).filter((cur, index, arr) => {
return index === (arr.length - 1)
})[0]
console.log(obj[lastIndex] === 'QJlU5mYDPXDTXA5vAAAD2') // true
JSON对象是无序的
所以,如果键名不能指定排序,是没有最后一项的概念,因为连手动排序的依据都没有
比如
{
'Y':123,
'A':234,
'G':345
}
这种情况下我们不指定一种排序方法(根据ASCII从大到小or从小到大),最后一项是G还是Y呢?我们看到的是G,但是console的时候最后一位是Y(chrome、firefox下浏览器根据键名字符从小到大排序)。
解决思路
1.提供键名排序依据,如不能则跳至6
2.Object.keys(jsonobj)取出键名数组
3.根据排序依据对数组进行排序
4.根据数组最后一位取出对应数据。
6.JSON对象换成数组
对象格式理论上是无序的,不能保证在不同环境下的遍历顺序,建议使用数组。
当然折中的方案是,约定要最后一项的key或传输数据里带上。
至于遍历对象,不考虑兼容性的情况下请使用Object.keys()先将对象转为数组再进行操作,这是标准推荐的做法。
考虑到旧浏览器的兼容的话可以for(..in..)。
经过测试发现,Firefox 55.0.3和chrome 61.0.3163.79版本的JSON顺序是不会变的,在QQ浏览器chrome53内核下可能会根据首字母的顺序发生变化。
8 回答4.8k 阅读✓ 已解决
6 回答3.5k 阅读✓ 已解决
5 回答2.9k 阅读✓ 已解决
5 回答6.4k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
没办法,Key-Value数据结构是无法保证其顺序的,不管是
for...in
还是其它任何迭代方法,若你真保证数据有效性,还是使用Array
吧。一个获取的写法: