JS 对象根据自定义的特定字符排序或归类


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);