Javascript 如何从对象获取无序的键数组

Javascript 如何从对象获取无序的键数组,javascript,angular,javascript-objects,Javascript,Angular,Javascript Objects,我的js中有来自后端的数据,如下所示: var list = { "6": { "id": 6, "name": "John", "age": 31 }, "42": { "id": 42, "name": "Alex", "age": 25 }, "3": { "id": 3, "name": "Tim", "a

我的js中有来自后端的数据,如下所示:

var list = {
    "6": {
        "id": 6,
        "name": "John",
        "age": 31
    },
    "42": {
        "id": 42,
        "name": "Alex",
        "age": 25
    },
    "3": {
        "id": 3,
        "name": "Tim",
        "age": 58
    },
};
然后我需要通过ngFor指令在我的angular html模板中显示这些数据。但首先我必须得到一个对象键数组:

var listKeys= Object.keys(list);
接下来,我可以在模板中输出数据:

<div *ngFor="let item of listKeys">
    <p>{{list[item].id}}</p>
    <p>{{list[item].name}}</p>
    <p>{{list[item].age}}</p>
    <hr>
</div>
但我没有访问后端的权限。我需要另一个解决办法

另外,我从后端获取数据的方式

  getData() {
    this._dataService.getList(this.name, this.age).subscribe(res => {
      this.list = JSON.parse(JSON.stringify(res));
      this.listKeys = Object.keys(this.list);
    });   
  }

根据定义,对象是无序的属性集合。作为解决方案,您可以使用数组而不是对象:

第一步是以相同的顺序将响应从服务器转换为数组

//从API接收的原始JSON字符串 var jsonString=`{ 6: { id:6, 姓名:约翰, 年龄:31 }, 42: { id:42, 姓名:亚历克斯, 年龄:25 }, 3: { id:3, 姓名:蒂姆, 年龄:58 } }`; //有序id的数组 常量orderedds=[]; //找到JSON字符串中的所有id并将它们推送到数组中 常量模式=/?id?\:\d*/g; 让我们比赛; 而match=pattern.execjsonString{ orderedIds.pushparseIntmatch[1]; } //解析原始JSON对象 const originalList=JSON.parsejsonString; //结果有序数组 常量结果=[]; //按顺序推送数组中的对象 orderedds的forx{ 结果:pushoriginalList[x]; } //记录生成的数组 document.getElementByIdresult.innerText=JSON.stringifyresult;
这必然会有边缘案例,但添加它是因为它有效

如果您是以JSON的形式从后端获取数据,那么您可以执行以下操作

注意:var json是一个占位符,因为您没有展示如何获取数据

var json=`{ 6: { id:6, 姓名:约翰, 年龄:31 }, 42: { id:42, 姓名:亚历克斯, 年龄:25 }, 3: { id:3, 姓名:蒂姆, 年龄:58 } }`; var result=JSON.parsejson.replace/\s?\d+:/g,“$1:”;
console.logObject.keysresult;是否使用数组而不是对象?Object.keyslist输出什么?JS.Object.keyslist输出[3,6,42]不保证对象中属性的顺序-您不需要访问后端,数据应该始终由使用者排序,除非它是较大数据(如分页数据等)的子集。。。无论如何,您的原始列表对象实际上并没有按照您认为的顺序进行迭代。请参阅-如上所述,为了保证顺序,请按照您喜欢的顺序将项目添加到数组中。在这种情况下使用对象是不正确的。@不正确。。。我假设列表中的对象是JSON.parse的结果@ironfist,确切地说,数据是如何从后端来的,var列表是如何定义的?但是我从服务器获取数据作为一个对象。或者我应该将一个对象转换成数组吗?转换成数组的问题-如果在客户端完成,那么您将得到相同的3、6、42order@ironfist您需要创建一个对象数组,而不是后端中的对象,以使它们具有相同的顺序,否则,在客户端,您将在迭代对象键时对其进行数字排序。我无法访问后端-因此,虽然这是一个很好的答案,但它不可能实现。您可以获取原始JSON字符串,搜索它以按顺序查找所有id,然后获取对象并从中创建一个新数组,按你之前拿的身份证订购。
  getData() {
    this._dataService.getList(this.name, this.age).subscribe(res => {
      this.list = JSON.parse(JSON.stringify(res));
      this.listKeys = Object.keys(this.list);
    });   
  }