使用javascript重命名数组中的对象键

10

在我的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"。

问题: 关键字未更改!

6个回答

18

使用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函数中返回的对象内(“名称”,“数据”)中。 - eladcon
所以我应该逐个元素传递到这个方法中吗? - Sajeetharan
1
不是整个数组,看看我的修改,你的输出是resultArray变量。 - eladcon
现在我有一个变量里面存储了ID和名称。那么如何在不硬编码ID和名称的情况下获取它们的值呢? - Sajeetharan

11
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);

2

编辑:刚看到您的Angular标签 - 使用Angular的forEach:

var out = [];

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

没有使用Angular:

对于现代浏览器,可以使用数组.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);

2
你也可以这样做: 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}))

1
有趣。由于map函数没有明确描述{id,name}的语法,我不得不深入挖掘:这是一个通用的JavaScript特性(不仅适用于map),称为"对象解构" - dlauzon
确实,我在这里写了一些关于这个问题的问题:https://www.coderanx.com/javascript/javascript-three-dots-in-depth#objects-spread-and-rest - Artur Carvalho

1

您还可以使用Underscore.jsmap方法:

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

请看示例:Fiddle

1
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

请提供有关如何回答问题的信息。 - Jawad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接