关于Javascript:按索引排序数组

Sort by index an array

本问题已经有最佳答案,请猛点这里访问。

请看下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    var exemples =  [
            {
                'name'     : 'd',
                'index'    : 3
            },
            {
                'name'     : 'c',
                'index'     : 2
            },
            {
                'name'     : 'a',
                'index'    : 0
            },
            {
                'name'     : 'b',
                'index'    : 1
            }
        ];

      const list = exemples.map((exemple, index, array) => exemple.name)

      console.log(list)

它给了我数组:

1
["d","c","a","b"]

我希望尊重索引并得到这样的结果:

1
["a","b","c","d"]

听起来是个基本问题,但我需要你的帮助。谢谢。


首先,通过一个将比较索引的自定义排序函数对列表进行排序,然后进行映射。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    var exemples =  [
            {
                'name'     : 'd',
                'index'    : 3
            },
            {
                'name'     : 'c',
                'index'     : 2
            },
            {
                'name'     : 'a',
                'index'    : 0
            },
            {
                'name'     : 'b',
                'index'    : 1
            }
        ];

      const list = exemples.sort((a,b) => a.index - b.index).map((exemple, index, array) => exemple.name)

      console.log(list)


你不需要排序和过滤。使用Array#reduce。在一次迭代中,您可以得到排序后的元素。这比首先排序然后过滤更有效。这将为您提供O(N)解决方案。请参阅下面的示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var exemples = [{
    'name': 'd',
    'index': 3
  },
  {
    'name': 'c',
    'index': 2
  },
  {
    'name': 'a',
    'index': 0
  },
  {
    'name': 'b',
    'index': 1
  }
];

var ans = exemples.reduce(function (r,v) {
  r[v.index] = v.name;
  return r;
}, []);

console.log(ans);


可以在映射数组之前对其进行排序。下面是一个例子:

1
2
3
4
var exemples =  [{'name'     : 'd','index'    : 3},{'name'     : 'c','index'     : 2},{'name'     : 'a','index'    : 0},{'name'     : 'b','index'    : 1}];

const list = exemples.sort((v1, v2) => v1.index - v2.index).map((v) => v.name);
console.log(list)