有没有办法对JavaScript对象中的键进行排序/排序?
例如下面的例子有没有办法对JavaScript对象中的键进行排序/排序?,javascript,Javascript,例如下面的例子 var data = { 'States': ['NSW', 'VIC'], 'Countries': ['GBR', 'AUS'], 'Capitals': ['SYD', 'MEL'] } for (var item in data) { console.log(item); } 印刷品 States Countries Capitals 有没有办法按字母顺序排序以便打印 Capitals Countries States 不在对象本身内
var data = {
'States': ['NSW', 'VIC'],
'Countries': ['GBR', 'AUS'],
'Capitals': ['SYD', 'MEL']
}
for (var item in data) {
console.log(item);
}
印刷品
States
Countries
Capitals
有没有办法按字母顺序排序以便打印
Capitals
Countries
States
不在对象本身内:对象的属性集合是无序的 您可以做的一件事是使用
Object.keys()
,对数组排序,然后迭代它
Object.keys(data)
.sort()
.forEach(function(v, i) {
console.log(v, data[v]);
});
不支持ECMAScript第5版的浏览器的修补程序(实现):
是的,有。不在ECMAScript标准中,但支持跨浏览器和Node.js,而且显然是稳定的。看 编辑:返回一个对象,其中键是按顺序排列的。您可以使用
Object.keys(…)
从对象中获取已排序的键
为什么要担心对象键顺序?这种差异在某些应用程序中可能很重要,例如解析XML,将XML表示为嵌套对象,并使用XML标记作为哈希键
这里有几个注意事项:
- 看起来像整数的键首先以数字顺序出现
- 看起来像字符串的键将按插入顺序显示在下一步
- 此顺序由
Object.keys(obj)
报告的顺序在Safari、Firefox中可能不同for(obj中的var键){…}
function orderKeys(obj, expected) {
var keys = Object.keys(obj).sort(function keyOrder(k1, k2) {
if (k1 < k2) return -1;
else if (k1 > k2) return +1;
else return 0;
});
var i, after = {};
for (i = 0; i < keys.length; i++) {
after[keys[i]] = obj[keys[i]];
delete obj[keys[i]];
}
for (i = 0; i < keys.length; i++) {
obj[keys[i]] = after[keys[i]];
}
return obj;
}
这是回报
{ '3': 'charlie',
'5': 'eagle',
apples: 'e',
berries: 'e',
'p:nvSpPr': 'a',
'p:spPr': 'b',
'p:style': 'c',
'p:txBody': 'd' }
然后,您可以通过以下方式获取已排序的密钥:
Object.keys(obj)
返回
["3", "5", "apples", "berries", "p:nvSpPr", "p:spPr", "p:style", "p:txBody"]
如果转换为数组不适合您的模板,并且您知道对象的键,也可以执行以下操作: 在控制器中,按正确顺序定义键的数组:
this.displayOrder = [
'firstKey',
'secondKey',
'thirdKey'
];
在模板中,重复displayOrder的键,然后使用ng init引用回对象
<div ng-repeat="key in ctrl.displayOrder" ng-init="entry = ctrl.object[key]">
{{ entry.detail }}
</div>
{{entry.detail}
这里有一个很好的功能解决方案:
基本上
Object.keys
排序
键not_sorted={b:false,a:true};
排序=对象。键(未排序)
.sort()
.reduce(功能(acc,键){
acc[键]=未排序[键];
返回acc;
}, {});
console.log(排序)/{a:true,b:false}
ES6解决方案:
not_sorted={b:false,a:true}
排序=对象。键(未排序)
.sort()
.减少((附件,钥匙)=>({
…acc[键]:未排序[键]
}), {})
console.log(排序)/{a:true,b:false}
这里有一个单行程序,可以使用
使用您的示例数据:
var data = {
'States': ['NSW', 'VIC'],
'Countries': ['GBR', 'AUS'],
'Capitals': ['SYD', 'MEL']
}
data = _.chain(data)
.toPairs() // turn the object into an array of [key, value] pairs
.sortBy(0) // sort these pairs by index [0] which is [key]
.fromPairs() // convert array of pairs back into an object {key: value}
.value() // return value
/*
{
Capitals: [ 'SYD', 'MEL' ],
Countries: [ 'GBR', 'AUS' ],
States: [ 'NSW', 'VIC' ]
}
*/
我想将此作为评论添加到的帖子中,但我的代表级别不够高 如果任何人需要符合以下要求的
orderKeys
版本:
/**
*返回并修改输入对象,以便按排序方式返回其键
*调用`Object.keys(obj)`时的顺序
*
*@param{object}obj将对象的键排序
*
*@返回{object}输入的对象及其键的排序顺序
*/
常量orderKeys=(obj)=>{
//符合“no param reassign”,JavaScript似乎在这里通过引用进行分配
const newObj=obj;
//默认的“.sort()”链式方法似乎适合我
const keys=Object.keys(newObj.sort();
const after={};
//按'obj'键的排序顺序将键添加到'after'
key.forEach((key)=>{
[key]之后=newObj[key];
删除newObj[key];
});
//按排序顺序将键添加回'obj'
key.forEach((key)=>{
newObj[key]=在[key]之后;
});
返回newObj;
};
使用的测试:
const示例={
3:‘查理’,
‘p:style’:‘c’,
浆果:“e”,
“p:nvSpPr”:“a”,
“p:txBody”:“d”,
苹果:“e”,
5.‘鹰’,
p:spPr:'b'
}
const obj=顺序键(示例);
控制台日志(obj);
console.log(Object.keys(obj));
产出如下:
Babel Compiler v6.4.4
Copyright (c) 2014-2015 Sebastian McKenzie
{ 3: 'charlie',
5: 'eagle',
apples: 'e',
berries: 'e',
'p:nvSpPr': 'a',
'p:spPr': 'b',
'p:style': 'c',
'p:txBody': 'd' }
[ '3',
'5',
'apples',
'berries',
'p:nvSpPr',
'p:spPr',
'p:style',
'p:txBody' ]
不管它值多少钱,我都需要在我的React应用程序中使用它,这样我就可以根据
状态
对象对下拉列表中的选项进行排序,该对象是在我的API响应之后分配的
起初我是这样做的
return (
// ...
<Select
options={Object.keys(obj).sort()}
// ...
/>
// ...
);
返回(
// ...
// ...
);
但是意识到每次重新渲染时都会调用.sort()
方法,因此需要实现orderKeys
您也可以用这种方式对其进行排序
const data = {
States: ['NSW', 'VIC'],
Countries: ['GBR', 'AUS'],
Capitals: ['SYD', 'MEL']
}
const sortedObject = Object.fromEntries(Object.entries(data).sort())
我无法详细解释为什么它能工作,但显然它工作得完美无缺:)如果你不相信我,试试你自己:D
请注意,您的浏览器或Node.js版本应支持Object.fromEntries
有关浏览器兼容性,请检查
对于Node,它将适用于12及更高版本。
对于v1中的Deno。值得一看:可能的副本也值得一看:值得添加。如果希望颠倒排序顺序,可以将.sort()替换为.replace()。此外,sort()和reverse()接受比较函数作为参数,允许您微调排序@CharlesJaimet:不确定你所说的
.replace()
是什么意思。你是说.reverse()
?这确实可以使用,但前提是您希望当前顺序颠倒。如果要颠倒排序顺序,则必须首先对其进行排序。.sort()
方法确实接受函数,但是.reverse()
不接受。谢谢@squint。打字太快,思考太慢。:)这解决了我的问题,但我想知道函数(v,I)中的I
参数是什么represents@WillCarron:它是当前迭代的数字索引。因此,如果有3个键,i
将在每次调用回调时分别给出0
、1
、2
。因为函数中没有使用i
,所以可以安全地删除它,因为JS从不要求您为传递的所有或任何参数提供参数。使用brow中可用的日志记录工具
return (
// ...
<Select
options={Object.keys(obj).sort()}
// ...
/>
// ...
);
const data = {
States: ['NSW', 'VIC'],
Countries: ['GBR', 'AUS'],
Capitals: ['SYD', 'MEL']
}
const sortedObject = Object.fromEntries(Object.entries(data).sort())