Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 关联数组的排序键_Javascript_Jquery - Fatal编程技术网

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值的租金以满足模板的期望。不管怎样,我想我会在后端寻找方法。