Angular 5中如何从Promise返回数组?对象转数组排序疑问
问题分析与解决方案
嘿,我来帮你理一理这个问题~首先直接给结论:优先把对象转回数组,这是更贴合你需求的方案,原因我慢慢给你拆解:
为什么不建议直接对对象排序?
- JavaScript里的普通对象本质是无序的(虽然现代浏览器会保留数字键的顺序,但这属于非标准行为,不能依赖),所谓“对对象排序”本身没有实际意义,遍历对象时的顺序无法保证和你排序后的逻辑一致。
- Angular的
*ngFor指令只能遍历数组或可迭代对象,如果用对象的话,你得额外套keyvalue管道,不仅写法繁琐,而且管道的排序逻辑远不如数组的sort()方法灵活,后续维护成本更高。
怎么把对象转回数组?
根据你的对象结构,有几种常用方法:
- 如果对象是数字索引的类数组(比如
{0: 'item1', 1: 'item2'}),直接用Object.values()就能快速转成数组:const arrayFromObj = Object.values(yourObject); - 如果对象里包含额外属性,或者需要提取特定字段,可以用
Object.entries()配合map()处理:// 比如只保留对象里的value部分 const arrayFromObj = Object.entries(yourObject).map(([key, value]) => value);
转回数组后的排序与使用
转回数组后,你就能直接用数组原生的sort()方法按需求排序,比如按某个特定字段排序:
// 假设每个元素有个名为sortKey的字段,数字类型排序 const sortedArray = arrayFromObj.sort((a, b) => a.sortKey - b.sortKey); // 如果是字符串类型,用localeCompare处理多语言排序 const sortedArray = arrayFromObj.sort((a, b) => a.sortKey.localeCompare(b.sortKey));
最后把排序后的数组传给Angular模板,用*ngFor就能正常遍历展示了:
<div *ngFor="let item of yourSortedArray"> {{ item.yourProperty }} </div>
结合你的Promise代码示例
调整后的完整逻辑大概是这样:
var tempArray = [] return new Promise((resolve, reject) => { let error = false; var i = 0; // 你的原有逻辑...(这里注意检查为什么tempArray会变成对象,从源头避免可能更好) if (!error) { // 把对象转回数组 const arrayFromObj = Object.values(tempArray); // 按特定值排序 const sortedArray = arrayFromObj.sort((a, b) => a.yourSpecificValue - b.yourSpecificValue); resolve(sortedArray); // 返回排序后的数组 } else { reject('error'); } })
内容的提问来源于stack exchange,提问作者oudekaas
相关产品推荐
相关产品推荐

