我有下面的代码按字母顺序对对象进行排序,我想摆脱字母顺序并按自己选择的顺序进行排序。
var obj = {
c: "see",
a: "ay",
b: "bee",
d: "dee"
};
console.log("Object order:");
var key, keys = [];
for (key in obj) {
keys.push(key);
}
console.log(keys.map(function(key) { return key + ": " + obj[key];}).join(", "));
console.log("Sorted order:");
keys = Object.keys(obj).sort()
console.log(keys.map(function(key) { return key + ": " + obj[key];}).join(", "));
上面的代码将输出a,b,c,d的对象顺序-但是可以说我希望数组具有自己的顺序,例如
var sortedArray = ['b','c','d','a'];
那么我怎么知道在我的sortedArray
中实现这个.sort
呢?
预期结果:
var newObj = {
b: "bee",
c: "cee",
d: "dee",
a: "ay"
};
谢谢
答案 0 :(得分:1)
您可以将自定义排序功能传递到sort()
API中。请参见下面的示例:
var items = [
{ name: 'Edward', value: 21 },
{ name: 'Sharpe', value: 37 },
{ name: 'And', value: 45 },
{ name: 'The', value: -12 },
{ name: 'Magnetic', value: 13 },
{ name: 'Zeros', value: 37 }
];
// sort by value
items.sort(function (a, b) {
return a.value - b.value;
});
// sort by name
items.sort(function(a, b) {
var nameA = a.name.toUpperCase(); // ignore upper and lowercase
var nameB = b.name.toUpperCase(); // ignore upper and lowercase
if (nameA < nameB) {
return -1;
}
if (nameA > nameB) {
return 1;
}
// names must be equal
return 0;
});
console.log(items)
答案 1 :(得分:1)
这是一种非常奇怪的模式,但是,根据需要,我创建了一个名为CustomOrderBy
的函数,该函数将根据键数组进行排序。
类似这样的东西:
您已经有了一个数组,该数组具有要从头到尾排序的键,就像您已经拥有(sortedArray
)一样。然后,将此数组传递给函数。
然后,该函数循环遍历obj键并获取其第一个字母,以检查其是否与键的arra匹配,并获取其索引。根据索引进行排序。
排序后,它会创建一个新的obj,并按照之前使用的sort
函数中创建的顺序设置键和值
请,请参阅代码以更好地理解它。
var sortedArray = ['b', 'c', 'd', 'a'];
var obj = {
c: "see",
a: "ay",
b: "bee",
d: "dee"
};
function CustomOrderBy(keyOrder){
let keysSorted = Object.keys(obj).sort(function(keyA, keyB) {
let idxA = keyOrder.indexOf(keyA[0]);
let idxB = keyOrder.indexOf(keyB[0]);
if (idxA > idxB){
return 1
}else if(idxA < idxB){
return -1
}else{
return 0;
}
});
let sorted = {};
for (var key of keysSorted){
if (obj[key] != null){
sorted[key] = obj[key];
}
}
return sorted;
}
console.log(CustomOrderBy(sortedArray))
答案 2 :(得分:0)
使用使用indexOf()
var sortedArray = ['b', 'c', 'd', 'a'];
var obj = {
c: "see",
a: "ay",
b: "bee",
d: "dee"
};
var keys = Object.keys(obj).sort(function(a, b) {
// TODO - cases where not in sortedArray
return sortedArray.indexOf(a) - sortedArray.indexOf(b)
});
console.log(keys)
答案 3 :(得分:0)
请问我,但是排序顺序和对象之间的关系是否一对一,为什么我们不做这样的事情(从排序顺序数组开始):
var myObject = {c: "see", a: "ay", b: "bee", d: "dee"};
var sortOrder = ['b','c','d','a'];
const mySort = (obj, order) => order.reduce((r,c) => (r[c] = obj[c], r), {})
console.log(mySort(myObject, sortOrder))
由于它仅使用一个reduce,因此看起来会更加简洁和简单。
答案 4 :(得分:-1)
您可以像下面一样创建一个函数。并传递您的对象,它将返回排序后的对象给您。
var obj = {
c: "see",
a: "ay",
b: "bee",
d: "dee"
};
function sortObject(obj)
{
var keys = [];
var outputObj = {};
for (key in obj)
{
keys.push(key);
}
keys.sort();
for(var i=0; i<keys.length; i++){
outputObj[keys[i]] = obj[keys[i]];
}
return outputObj;
}
console.log(sortObject(obj));