let obj1 = {
a_beijing: "xx",
a_shanghai: "xx",
a_guangzhou: "xx",
b_beijing: "xx",
b_shanghai: "xx",
b_guangzhou: "xx",
c_beijing: "xx",
c_shanghai: "xx",
c_guangzhou: "xx",
};
let obj2 = {
a_beijing: "xx",
b_beijing: "xx",
c_beijing: "xx",
a_shanghai: "xx",
b_shanghai: "xx",
c_shanghai: "xx",
a_guangzhou: "xx",
b_guangzhou: "xx",
c_guangzhou: "xx",
};
如上: obj1中按首字母排序,想根据"_"后的第一个字母为条件,进行排序或分组,得到类拟obj2这样的新对象。
obj2 = (
function(obj){
a = [];
for (var i in obj){
a.push(i)
}
a.sort(function(x,y){
xs = x.split('_');
ys = y.split('_');
if (xs[1]>ys[1]){return 1}
if (xs[1]<ys[1]){return -1}
return xs[0]>ys[0]?1:-1
});
r = {};
for(var i=0;i<a.length;i++){
r[a[i]] = obj[a[i]]
}
return r
}
)(obj1)
该回答引用ChatGPT
可以通过以下步骤实现对象根据自定义特定字符排序或归类:
1、将对象的键按照指定规则排序:
let sortedKeys = Object.keys(obj1).sort((a, b) => {
// 以 "_" 分隔键名,并以第二个元素为排序依据
let aSort = a.split("_")[1];
let bSort = b.split("_")[1];
return aSort.localeCompare(bSort);
});
这个排序方法将会按照键名中 "_" 后的第一个字母进行排序。如果您需要按照更复杂的规则进行排序,可以自定义排序函数。
2、遍历排序后的键,并将其归类到新的对象中:
let newObj = {};
sortedKeys.forEach(key => {
// 获取 "_" 后的第一个字母,作为新对象的属性名
let group = key.split("_")[1];
if (!newObj[group]) {
newObj[group] = {};
}
newObj[group][key] = obj1[key];
});
这个代码会遍历排序后的键名,并将其归类到一个新的对象中。新对象的属性名是键名中 "_" 后的第一个字母,属性值是包含相应键值的子对象。
完整代码如下:
let obj1 = {
a_beijing: "xx",
a_shanghai: "xx",
a_guangzhou: "xx",
b_beijing: "xx",
b_shanghai: "xx",
b_guangzhou: "xx",
c_beijing: "xx",
c_shanghai: "xx",
c_guangzhou: "xx",
};
let sortedKeys = Object.keys(obj1).sort((a, b) => {
// 以 "_" 分隔键名,并以第二个元素为排序依据
let aSort = a.split("_")[1];
let bSort = b.split("_")[1];
return aSort.localeCompare(bSort);
});
let newObj = {};
sortedKeys.forEach(key => {
// 获取 "_" 后的第一个字母,作为新对象的属性名
let group = key.split("_")[1];
if (!newObj[group]) {
newObj[group] = {};
}
newObj[group][key] = obj1[key];
});
console.log(newObj);