使用object.entries对对象进行排序

时间:2019-05-30 21:50:44

标签: javascript

我有一个要排序的数据对象。我正在通过import pathlib from subprocess import check_output from setuptools import find_packages, setup _VERSION_FILE = pathlib.Path(".version") # Add it to .gitignore! _GIT_COMMAND = "git describe --tags --long --dirty" _VERSION_FORMAT = "{tag}.dev{commit_count}+{commit_hash}" def get_version() -> str: """ Return version from git, write commit to file """ if _VERSION_FILE.is_file(): with _VERSION_FILE.open() as f: return f.readline().strip() output = check_output(_GIT_COMMAND.split()).decode("utf-8").strip().split("-") tag, count, commit = output[:3] dirty = len(output) == 4 if count == "0" and not dirty: return tag version = _VERSION_FORMAT.format(tag=tag, commit_count=count, commit_hash=commit) with _VERSION_FILE.open("w") as f: print(version, file=f, end="") return version _version = get_version() setup( name="mypackage", package_data={ "": [str(_VERSION_FILE)] }, version=_version, packages=find_packages(exclude=["tests"]), ) 运行以下对象以在前端显示它,但我想维持特定的顺序。现在看来,顺序有点随机。我使用Object.entries(data).map()来显示许多React组件,因此似乎无法在地图后进行排序。

.map

理想情况下,const data = { rent: { value: '100' }, }, legal: { value: '300' }, misc: { value: '300' }, horse: { value: '400' } }, }; 应该是第一个被映射的项目,rent应该是最后一个。我尝试使用misc,但似乎没有运气。

实现此目标的正确方法是什么?我假设使用.sort()的某种组合,但似乎无法弄清楚。

3 个答案:

答案 0 :(得分:1)

如果要使用sort,则必须提供与Object.entries函数的比较函数:

const data = {
  rent: {
   value: '100'
  },
  legal: {
    value: '300'
  },
  misc: {
    value: '201'
 },
 horse: {
   value: '400'
 }
};

function compare(a, b){
  if( a[1].value < b[1].value ){
    return -1
  } else if( a[1].value > b[1].value ){
    return 1;
  } 
  return 0;
}
console.log(Object.entries(data).sort(compare))

如果原始数据结构是对象数组,则上面的代码将变得更加简洁:

const data = [
  { key: 'rent', value: '100' },
  { key: 'legal', value: '300' },
  { key: 'misc', value: '201' },
  { key: 'horse', value: '400' }
];

let sorted = data.sort(({key:k1, value:v1}, {key:k2, value:v2}) => {
  if( v1 < v2 ){
    return -1;
  } else if( v1 > v2 ){
    return 1;
  }
  return 0;
})
console.log('sorted arr', sorted)

答案 1 :(得分:0)

如果需要保持一致的顺序,请使用对象数组而不是单个对象。无法保证对象的属性顺序。

const data = [
  { name: 'rent', value: '100' },
  { name: 'legal', value: '300' },
  { name: 'misc', value: '300' },
  { name: 'horse', value:'400' }
];

const sortedData = data.sort((a, b) => {
    return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
});

console.log(sortedData);

答案 2 :(得分:0)

以下内容将对它们进行排序,以使租金排在最前,杂项排在最后,其余按字母顺序

const data = {
  rent: {
    value: '100'
  },
  legal: {
    value: '300'
  },
  misc: {
    value: '300'
  },
  horse: {
    value: '400'
  }
};

function rent_ab_misc(obj=[]){
  return Object.entries(obj).sort(([key1], [key2]) => {
    if (key1 === 'misc' || key2==='rent') return 1;
    if (key1 === 'rent' || key2 === 'misc') return -1;
    return key1 > key2
  })
}

// useage
const output = rent_ab_misc(data).map(([key,item])=>`<div>${key}:${item.value}</div>`)

console.log(output);