【问题标题】:Rename Object Key in an array using javascript使用javascript重命名数组中的对象键
【发布时间】:2015-05-14 10:41:43
【问题描述】:

在我的 Angular 应用程序中,我得到了如下所示的 Json 数据。

[{"id":"5","name":"Immidiate"},
{"id":"4","name":"30 days"},
{"id":"3","name":"21 days"},
{"id":"2","name":"14 days"},
{"id":"1","name":"7 days"},
{"id":"6","name":"Custom"}]

我需要如下输出,

[{"Name":"5","Data":"Immidiate"},
{"Name":"4","Data":"30 days"},
{"Name":"3","Data":"21 days"},
{"Name":"2","Data":"14 days"},
{"Name":"1","Data":"7 days"},
{"Name":"6","Data":"Custom"}]

这是我的代码

$rootScope.DashboardData["Name"] =  widget.seriesname ;
delete $rootScope.DashboardData[widget.seriesname];                
$rootScope.DashboardData["data"] =  widget.dataname ;
delete $rootScope.DashboardData[widget.seriesname];
widget.chartSeries = $rootScope.DashboardData;

widget.seriesname 是“id”,widget.dataname 是“name”。

问题:密钥没有改变!

【问题讨论】:

    标签: javascript json angularjs html


    【解决方案1】:

    你也可以这样做:

    arr.map(({id, name}) =>({name: id, data:name}))

    const objArr = [
        { id: "5", name: "Immidiate" },
        { id: "4", name: "30 days" },
        { id: "3", name: "21 days" },
        { id: "2", name: "14 days" },
        { id: "1", name: "7 days" },
        { id: "6", name: "Custom" },
      ];
    
    objArr.map(({id, name}) =>({name: id, data:name}))
    

    【讨论】:

    • 有趣。由于map 函数没有明确描述{id, name} 的语法,我不得不挖掘一下:这是一个通用的javascript 功能(不仅适用于map),称为"Object destructuring"
    • 确实,我在这里写了一些关于此的一些问题:coderanx.com/javascript/…
    【解决方案2】:
    var books = {
      "mainKey1": {
        "History" : [
          {"hai" : "hello"},
          {"hai" : "bye"}
        ],
        "tempKey" : "tempValue"
      },
      "mainKey2":{
        "Number": "AD-3424",
        "Number1": "AD-3424"
      },
      "temparr" : [
        "ai",
        "bi"
      ]
    
    };
    
    function replaceKeys(books,replacementkeys,newKeyJson) {
      if(typeof books == 'object') {    
        newKeyJson = Object.keys(books).map((book) => {
          if(typeof books[book] == 'object' || Array.isArray(books[book]) ) {
            replaceKeys(books[book],replacementkeys,newKeyJson[book])
          }
          if(replacementKeys[book]) {
              newKeyJson[replacementKeys[book]] = books[book];          
              delete newKeyJson[book];          
          }
        })
    
      }
      else if(Array.isArray(books)) {
       for( var i=0;i< books.length;i++) {
            replaceKeys(books[i],replacementkeys,newKeyJson[i]);
       }
      }else if(typeof books == 'string') {
        return;
      }else {
        return;
      }
    }
    
    var replacementKeys = {"History" : "replaced History","hai" : "hi","Number" : "test","Number1" : "test2","mainKey1" :"sidekey","tempKey" : "realKey","mainKey2" :"side2"};
    var newKeyJson = Object.assign({},books);
    replaceKeys(books,replacementKeys,newKeyJson);
    console.log(newKeyJson); //this will contain object with updated keys
    

    【讨论】:

    • 请提供有关如何帮助回答问题的信息
    【解决方案3】:
    const arr = [{"id":"5","name":"Immidiate"},
    {"id":"4","name":"30 days"},
    {"id":"3","name":"21 days"},
    {"id":"2","name":"14 days"},
    {"id":"1","name":"7 days"},
    {"id":"6","name":"Custom"}];
    
    const resultArray = arr.map(elm => ({ Name: elm.id, Data: elm.name}));
    
    console.log(resultArray);
    

    【讨论】:

      【解决方案4】:

      使用map函数:

      var array = [{"id":"5","name":"Immidiate"},
      {"id":"4","name":"30 days"},
      {"id":"3","name":"21 days"},
      {"id":"2","name":"14 days"},
      {"id":"1","name":"7 days"},
      {"id":"6","name":"Custom"}];
      
      var resultArray = array.map(function(elm) {
         return { Name: elm[widget.seriesname], Data: elm[widget.dataname]};
      });
      

      【讨论】:

      • 新的键在你在map函数中返回的对象("Name","Data")
      • 所以我应该把这个方法里面的元素一一传入?
      • 不是整个数组。看看我的编辑,你的输出是 resultArray 变量
      • 现在我在变量中有 id 和 name。那么如何在不硬编码 id 和 name 的情况下获取值?
      【解决方案5】:

      编辑:刚刚看到你的角度标签 - 使用角度的 forEach:

      var out = [];
      
      angular.forEach(data, function (obj) {
          out.push({
              Name: obj.id,
              Data: obj.name
          });
      });
      

      没有角度:

      对于现代浏览器,使用 array.map:

      var out = data.map(function (obj) {
         return {
              Name: obj.id,
              Data: obj.name
          };
      });
      
      console.log(out);
      

      在旧版浏览器中:

      var data = [{"id":"5","name":"Immidiate"},
                 {"id":"4","name":"30 days"},
                 {"id":"3","name":"21 days"},
                 {"id":"2","name":"14 days"},
                 {"id":"1","name":"7 days"},
                 {"id":"6","name":"Custom"}];
      
      var out = [];
      
      for (var key in data) {
          if (data.hasOwnProperty(key)) {
              out.push({
                  'Name': data[key].id,
                  'Data': data[key].name
              });
          }
      }
      
      console.log(out);
      

      【讨论】:

        【解决方案6】:

        你也可以使用Underscopre.jsmap方法:

        $scope.newList = _.map(list, function(item) {
         return { Name: item.id, Data: item.name};
        });
        

        参见 Fiddle

        中的示例

        【讨论】:

          猜你喜欢
          • 2011-06-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-26
          • 2018-05-17
          • 2021-05-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多