我有一个要排序的数据对象。我正在通过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()
的某种组合,但似乎无法弄清楚。
答案 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);