Javascript 如何将Json数组转换为Json对象并保持元素顺序

Javascript 如何将Json数组转换为Json对象并保持元素顺序,javascript,json,Javascript,Json,我有一个JSON对象,想要对其进行排序,所以我将其转换为JSON数组 现在,在对json数组进行排序之后,我想将它转换为json对象,就像它在开始时一样,而不会丢失元素的顺序 JSON数组: grille.weeks = [{ "2020_1": { "calculated": "18.00", "ddeb": "2020-01-01", "dfin"

我有一个JSON对象,想要对其进行排序,所以我将其转换为JSON数组 现在,在对json数组进行排序之后,我想将它转换为json对象,就像它在开始时一样,而不会丢失元素的顺序

JSON数组:

grille.weeks = [{
  "2020_1": {
    "calculated": "18.00",
    "ddeb": "2020-01-01",
    "dfin": "2020-01-05",
    "partiel": true,
    "planified": "",
    "productiveRealised": "",
    "realised": ""
  }
}, {
  "2020_2": {
    "calculated": "35.00",
    "ddeb": "2020-01-06",
    "dfin": "2020-01-12",
    "partiel": false,
    "planified": "",
    "productiveRealised": "",
    "realised": ""
  }
}]}
我想将其转换为这个JSON对象:

grille.weeks = {
  "2020_1": {
    "calculated": "18.00",
    "ddeb": "2020-01-01",
    "dfin": "2020-01-05",
    "partiel": true,
    "planified": "",
    "productiveRealised": "",
    "realised": ""
  }
, 
  "2020_2": {
    "calculated": "35.00",
    "ddeb": "2020-01-06",
    "dfin": "2020-01-12",
    "partiel": false,
    "planified": "",
    "productiveRealised": "",
    "realised": ""
  }
}

最好的方法是什么?

这里有一种方法:

const before=[{
2020_1: {
计算:“18.00”,
ddeb:“2020-01-01”,
dfin:“2020-01-05”,
partiel:没错,
平面化:“,
产品化:,
意识到:“
}
}, {
2020_2: {
计算:“35.00”,
ddeb:“2020-01-06”,
dfin:“2020-01-12”,
partiel:错,
平面化:“,
产品化:,
意识到:“
}
}];
const after=before.reduce((acc,cur)=>({…acc,…cur}));

console.log(之后)谢谢大家的帮助,我找到了一个解决我的问题的方法,想和大家分享一下。。。虽然我不建议只在这种情况下使用

解决办法是:

我创建了一个函数,该函数从jsonObject获取键并对它们进行排序,然后通过一个循环,使用排序后的键将对象合并到一个字符串变量中

  function toString(obj){         
                             
    var str="{\"weeks\":{";
    Object.keys(obj).sort(function(a,b){
//I split the key to sort it properly ex : "2020_1" => [2020,1]
          var yeara = parseInt(a.split('_')[0]);
          var yearb  = parseInt(b.split('_')[0]);
          var indicea = parseInt(a.split('_')[1]);
          var indiceb = parseInt(b.split('_')[1]);
          
          if(yeara==yearb){
          if(indicea>indiceb) return 1
          if(indicea<indiceb ) return -1
          if(indicea==indiceb ) return 0
          
          }
          if(yeara>yearb) return 1
          if(yeara<yearb) return -1
          
          }).forEach(function(key,idx,array) {
          if(idx == array.length-1)
          str+='"'+key+'":'+JSON.stringify(obj[key]) 
          else
          str+='"'+key+'":'+JSON.stringify(obj[key])+','
      
    })
    
    str+="}}";
     return str;
    }
函数到字符串(obj){
var str=“{\'周\”:{”;
Object.key(obj).sort(函数(a,b){
//我拆分键以正确排序,例如:“2020_1”=>[2020,1]
var yeara=parseInt(a.split(“”“)[0]);
var yearb=parseInt(b.split(“”“)[0]);
var indicatea=parseInt(a.split(“”“)[1]);
var indicateb=parseInt(b.split(“”“)[1]);
如果(年a==年b){
如果(指示符号>指示符号)返回1
如果(指示年份B)返回1

如果(yearaAn)一个对象是无序的,如果它是一个对象,那么顺序就不重要了?如果你想保持顺序,就使用数组。除了Craicerjack已经指出的,你应该知道,对于每个JS环境,你必须检查一个
对象
-对象(创建)键顺序可以得到保证………因此,对于
对象
引用,使用SO自己的
console.log
实现的每个答案都不能证明任何东西。如果有,那么
console.log(Object.keys(obj))
@Craicerjack嗯,我不能,我被迫将JSON对象以这种格式存储在数据库中……下面的解决方案工作得很好,并且保持了order@PeterSeliger很抱歉,事实上它们被引用了..我编辑了这个问题,这段代码工作得很好,但不适合我,因为我使用的是旧版本的javascript,所以lambda表达式不适用rk对我来说…有什么更老的方法吗?@AmineChoukri签出更新后的解决方案,它在遗留环境中应该可以很好地工作。@HaoWu…关于第二种方法,如果使用
对象。分配
一个非常安全的方法可以保留
reduce
;只需使用一个好的旧函数表达式而不是胖箭头。@Pe简洁我不确定,所以我没有使用任何奇特的数组函数@HaoWu不幸的是相同的prblm…”对象。赋值“对我不起作用…”。。。