Javascript 关联数组的排序键
我有这样的数据:Javascript 关联数组的排序键,javascript,jquery,Javascript,Jquery,我有这样的数据: { "Item 1": { "Purchased": { "quantity": "5.000", "cost": "80.000" }, "Rent": { "quantity": "45.000", "cost": "25200.000" } }, "Item 2": { "Purchased": { "quantity": "35.000", "cos
{
"Item 1": {
"Purchased": {
"quantity": "5.000",
"cost": "80.000"
},
"Rent": {
"quantity": "45.000",
"cost": "25200.000"
}
},
"Item 2": {
"Purchased": {
"quantity": "35.000",
"cost": "25000.000"
},
"Rent": {
"quantity": "0.0",
"cost": "0.0"
}
},
"Item 3": {
"Rent": {
"quantity": "25.000",
"cost": "50.000"
},
"Purchased": {
"quantity": "0.0",
"cost": "0.0"
}
},
"Item 4": {
"Rent": {
"quantity": "5.000",
"cost": "80.000"
},
"Purchased": {
"quantity": "0.0",
"cost": "0.0"
}
}
}
将数据打印到准备好的模板中。撇开它不谈,我想要的是每个项目的“购买”和“租赁”部分按字母顺序排序。此处第1项和第2项是适当的,但第3项和第4项不是。问题在于,来自服务器的项目可能包含不同类型的数据。例如,项目2仅随“已购买”一起提供,因此添加了0,0的租金部分
我在这里看到了一些字符串排序函数,但它们是针对单个数组的,我在这里没有采用它们。//那么你的意思是你基本上希望“购买”在“出租”之前出现?正如其他人所说,对象实际上没有秩序。所以,如果你想控制顺序,你可以使用lodash或类似的东西,比如
_ = require('lodash');
_.map(properties, (property, index) => {
let thisProp = {};
thisProp[`Item ${index + 1}`] = [{Purchased: property.Purchased}, {Rent: property.Rent}];
return thisProp;
});
这将以以下形式返回数据:
[
{
"Item 1": [
{
"Purchased": {
"quantity": "5.000",
"cost": "80.000"
}
},
{
"Rent": {
"quantity": "45.000",
"cost": "25200.000"
}
}
]
},
{
"Item 2": [
{
"Purchased": {
"quantity": "35.000",
"cost": "25000.000"
}
},
{
"Rent": {
"quantity": "0.0",
"cost": "0.0"
}
}
]
}
] //etc.
您也可以按照@Jonny Rathbone的建议进行操作,而无需使用任何其他库。照办
for (var p in DAT)
DAT[p]={Purchased:DAT[p].Purchased,
Rent:DAT[p].Rent};
现在,JSON.stringify()将按所需顺序列出属性。但是,正如@xufox和@blex已经评论过的那样:JavaScript中的属性顺序并没有真正定义,因此这里获得的结果可能无法在所有浏览器或未来的JavaScript版本中持续下去。以下代码片段在最流行的浏览器中满足您的要求。但是,正如您的问题下面已经提到的,规范并没有强制要求对象保持其顺序
const数据={
“项目1”:{
“购买”:{
“数量”:“5.000”,
“成本”:“80.000”
},
“租金”:{
“数量”:“45.000”,
“成本”:“25200.000”
}
},
“项目2”:{
“购买”:{
“数量”:“35.000”,
“成本”:“25000.000”
},
“租金”:{
“数量”:“0.0”,
“成本”:“0.0”
}
},
“项目3”:{
“租金”:{
“数量”:“25.000”,
“成本”:“50000”
},
“购买”:{
“数量”:“0.0”,
“成本”:“0.0”
}
},
“项目4”:{
“租金”:{
“数量”:“5.000”,
“成本”:“80.000”
},
“购买”:{
“数量”:“0.0”,
“成本”:“0.0”
}
}
}
功能sortItem(项目){
const sortedKeys=Object.key(item.sort())
返回sortedKeys.reduce((累计,键)=>({…累计,[键]:项[键]}),{})
}
const result=Object.keys(data).reduce((accu,key)=>({…accu,[key]:sortItem(data[key])),{})
console.log(result)
您试图对此对象执行什么操作?对象键没有顺序,因此无法对它们进行排序。如果顺序对数据本身很重要,请使用数组。@有一个模板是由其他人开发的(我不知道它是如何工作的),但我传递了对象,它在进行一些计算后以表格格式放置在正确的位置。现在的问题是,模板希望在租赁之前购买。所以上面的对象给出了错误的结果,仅此而已。无论如何,谢谢。对象属性中没有“before”或“after”。如果模板依赖于对象属性中的某种顺序,那么不要使用它。模板是在客户端(使用JS)还是服务器端呈现的?虽然对象键在JS中没有(可预测的)顺序,但它们在PHP中有,在那里你可以对它们进行排序/重新排序,只要它们不经过JS(除非在发送到服务器之前将它们保留为JSON字符串)@blex模板都在JS中。我现在正在看它,但它过于复杂,没有文件记录。后端是python/django,它发送JSON数据。问题是一些项目刚刚购买,因此前端(me)添加了0值的租金以满足模板的期望。不管怎样,我想我会在后端寻找方法。