Javascript 如何按对象键/值对js数组中的对象进行排序

Javascript 如何按对象键/值对js数组中的对象进行排序,javascript,Javascript,我有一个包含许多对象的数组。我试图根据每个对象的键值对数组进行排序 因此,对象看起来像这样: var info = [ {name: 'Adam', age: '1987-01-09T18:23:20.000Z'}, {name: 'Issac', age: '1988-09-02T11:17:11.000Z'}, {name: 'Tom', age: '2003-08-07T13:07:03.000Z'}, {name: 'Jane', age: '19

我有一个包含许多对象的数组。我试图根据每个对象的键值对数组进行排序

因此,对象看起来像这样:

var info = [ 
    {name: 'Adam', age: '1987-01-09T18:23:20.000Z'}, 
    {name: 'Issac', age: '1988-09-02T11:17:11.000Z'}, 
    {name: 'Tom', age: '2003-08-07T13:07:03.000Z'}, 
    {name: 'Jane', age: '1997-17-01T14:57:41.000Z'} 
]; 
我正在尝试将新的(排序的)数据保存到一个名为
sorted
的变量中

 var sorted = info.forEach(function(person) {
    var age = moment(String(person.age)).format('MM/DD/YYYY'); 

    return age 

    }, this);


 console.log(sorted)
所以,我有momentjs,可以将日期更改为一种时间格式,这种格式很容易 已排序,但
sorted
console.log显示的是
未定义的


老实说,我甚至不知道排序函数是如何工作的。至少它应该从循环中返回
age
,因此
console.log()
不应该是空的
forEach
不用于排序,也不用于更改数组。对于排序,您应该使用

sort
函数通过成对比较元素对数组进行排序。你需要给它一个函数来“比较”两个元素。“compare”函数接受两个参数
a
b
,如果
ab
,则应返回负数

因此,以下代码可能有效:

var info = [ 
    {name: 'Adam', age: '1987-01-09T18:23:20.000Z'}, 
    {name: 'Issac', age: '1988-09-02T11:17:11.000Z'}, 
    {name: 'Tom', age: '2003-08-07T13:07:03.000Z'}, 
    {name: 'Jane', age: '1997-12-01T14:57:41.000Z'} 
];

info.sort(function (a, b) {
    return (new Date(a.age)).getTime() - (new Date(b.age)).getTime()
})

另外请注意,您给出的第四个日期-
1997-17-01T14:57:41.000Z
,是无效的,因为月份数必须小于13。

forEach
不用于排序,也不用于更改数组。对于排序,您应该使用

sort
函数通过成对比较元素对数组进行排序。你需要给它一个函数来“比较”两个元素。“compare”函数接受两个参数
a
b
,如果
ab
,则应返回负数

因此,以下代码可能有效:

var info = [ 
    {name: 'Adam', age: '1987-01-09T18:23:20.000Z'}, 
    {name: 'Issac', age: '1988-09-02T11:17:11.000Z'}, 
    {name: 'Tom', age: '2003-08-07T13:07:03.000Z'}, 
    {name: 'Jane', age: '1997-12-01T14:57:41.000Z'} 
];

info.sort(function (a, b) {
    return (new Date(a.age)).getTime() - (new Date(b.age)).getTime()
})

另外请注意,您给出的第四个日期-
1997-17-01T14:57:41.000Z
,是无效的,因为月份数必须小于13。

请尝试以下操作:

var arrayOfObject = [ 
    {name: 'Adam', age: '1987-01-09T18:23:20.000Z'}, 
    {name: 'Issac', age: '1988-09-02T11:17:11.000Z'}, 
    {name: 'Tom', age: '2003-08-07T13:07:03.000Z'}, 
    {name: 'Jane', age: '1997-12-01T14:57:41.000Z'} 
];

arrayOfObject.sort(function (a, b) {
    return ((new Date(a.age)).getTime() - (new Date(b.age)).getTime());
})
尝试以下方法:

var arrayOfObject = [ 
    {name: 'Adam', age: '1987-01-09T18:23:20.000Z'}, 
    {name: 'Issac', age: '1988-09-02T11:17:11.000Z'}, 
    {name: 'Tom', age: '2003-08-07T13:07:03.000Z'}, 
    {name: 'Jane', age: '1997-12-01T14:57:41.000Z'} 
];

arrayOfObject.sort(function (a, b) {
    return ((new Date(a.age)).getTime() - (new Date(b.age)).getTime());
})

对于未定义的每个返回,map将返回一个新的数组。您可以为本机
排序编写自己的比较器,或者使用类似
lodash
\uTby(info,['name','age')
--forEach返回未定义,map将返回一个新数组。您可以为native
sort
编写自己的比较器,或者使用类似于
lodash
.sortBy(info,['name',age'])
--
1997-17-01T14:57:41.000Z
YYYY-DD-MM
格式有效,这是非常不标准和意外的…
>新日期('1997-17-01T14:57:41.000Z')=>无效日期
看起来至少chrome不支持这一点。我知道,这是JavaScript中的
无效日期。然而,OP正在尝试将其解析为moment.js中的YYYY-DD-MM日期。它本身是有效的,但它违反了标准,因为
YYYY-AA-BB
应该始终是
YYYY-MM-DD
,这在ISO 8601中是标准化的。@Xufox Oh…Good point-Moment.js实际上支持这一点吗?我还没有查过,但我有一种感觉,这将导致不明显的错误。
1997-17-01T14:57:41.000Z
YYYY-DD-MM
格式中有效,这是非常不标准和意外的…
>新日期('1997-17-01T14:57:41.000Z')=>无效日期
看起来至少chrome不支持这一点。我知道,在JavaScript中,这是一个无效日期。然而,OP正在尝试将其解析为moment.js中的YYYY-DD-MM日期。它本身是有效的,但它违反了标准,因为
YYYY-AA-BB
应该始终是
YYYY-MM-DD
,这在ISO 8601中是标准化的。@Xufox Oh…Good point-Moment.js实际上支持这一点吗?我还没有查过,但我有一种感觉,这将导致不明显的错误。等一下……语法,甚至括号都是一样的。太巧了。等等……语法,甚至括号都是一样的。真是巧合。