要按年份和季度排序,您可以使用以下 ES6 sn-p(您可以使用 ES5 做完全相同的事情,但我喜欢编写 ES6)
input.map((obj, index) => obj.name.split("'").reverse().concat(index)).sort().map(arr => input[arr[2]]);
让我们稍微分解一下
input.map((obj, index) => obj.name.split("'").reverse().concat(index))
map() 方法创建一个新数组,其结果是对该数组中的每个元素调用提供的函数。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map
我们的“提供的函数”通过' 字符拆分每个对象的“名称”属性,反转结果数组,并将当前索引添加到结果数组中。
这会产生一个如下所示的数组:
[
["2016", "Q1", 0],
["2016", "Q2", 1],
["2016", "Q3", 2],
["2015", "Q4", 3]
]
然后我们调用.sort,
sort() 方法对数组的元素进行就地排序并返回该数组。排序不一定是稳定的。默认排序顺序是根据字符串 Unicode 代码点。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
我们最终得到一个这样的数组:
[
["2015", "Q4", 3],
["2016", "Q1", 0],
["2016", "Q2", 1],
["2016", "Q3", 2]
]
所以我们现在有一个各种各样的附录,请注意我们在其中放入的索引没有按顺序排列。我们可以利用这种缺乏秩序来创造秩序。
我们所要做的就是再次调用 map,这次返回与我们存储在临时数组中的索引相关的原始对象。
.map(arr => input[arr[2]]);
当我们把它们放在一起并调用它时,我们最终会得到一个这样的数组:
[
{
name: "Q4'2015",
y: 0
}, {
name: "Q1'2016",
y: 0
}, {
name: "Q2'2016",
y: 0
}, {
name: "Q3'2016",
y: 0
}
]
这是一个演示:
let input = [
{
"name":"Q1'2016",
"y":0
},
{
"name":"Q2'2016",
"y":0
},
{
"name":"Q3'2016",
"y":0
},
{
"name":"Q4'2015",
"y":0
}
];
input = input.map((obj, index) => obj.name.split("'").reverse().concat(index)).sort().map(arr => input[arr[2]]);
console.log(input);
在 ES5 中做同样的事情:
input.map(function(obj, index){
return obj.name.split("'").reverse().concat(index);
}).sort().map(function(arr){
return input[arr[2]];
});