如何将JavaScript对象键名转换为大写?

15

有没有人知道一个好方法可以把这个转换成:?

var obj = [{key1: value1,key2: value2},{key3: value3,key4: value4}];

转化为:

var obj = [{Key1: value1,Key2: value2},{Key3: value3,Key4: value4}];

3
您为什么想这样做呢?任何使用旧密钥的代码都会出现问题,因为密钥区分大小写。 - Marc B
你是在寻找一个正则表达式,还是想要在代码运行时实现它的方式? - beatgammit
1
@Marc B,如果我正在制作jqgrids并且列名的第一个字母是大写的,那么我很可能会选择这样做。然后假设我从现有API获取json并且键实际上必须匹配大小写,以便jqgrid能够正常工作。在这种情况下,我希望确保从json获取的键也具有大写的第一个字母,因此匹配。 - Brandon Minton
@tjameson,考虑到我经常需要执行此操作的频率,速度不是瓶颈,因此我认为任何函数都可以使用,包括正则表达式。 - Brandon Minton
8个回答

21

循环删除和替换:

var obj = [{key1: 1,key2: 1},{key3: 1,key4: 1}];
for(var i = 0; i<obj.length;i++) {

    var a = obj[i];
    for (var key in a) {
        if (a.hasOwnProperty(key)) {
          a[key.charAt(0).toUpperCase() + key.substring(1)] = a[key];
          delete a[key];
          
        }
    }
    obj[i] = a;

}

+1,但请注意,如果起始对象包含特定键名的小写和首字母大写版本,则后者将被覆盖。即{key1:1, Key1:2}最终会变成{Key1:1}。(此外,在for之后的obj[i] = a;是多余的,不是吗?) - nnnnnn
唯一的区别是我使用了切片(slice)而不是子字符串(substring)。除此之外,这非常优秀。 - Brandon Minton
1
在设置新属性之后,您可以删除原始属性(a[key]),然后您就不需要临时变量了。 - Programmer
Object.keys(a).forEach((key) => { a[key.charAt(0).toUpperCase() + key.substring(1)] = a[key]; delete a[key]; }); - A. Horst

9
截至 2019 年,您可以使用 Object.fromEntries 方法:

let populations = {london: 8.9, beijing: 21.54, mumbai: 18.41};  // March 2020

let entries = Object.entries(populations);
let capsEntries = entries.map((entry) => [entry[0][0].toUpperCase() + entry[0].slice(1), entry[1]]);
let capsPopulations = Object.fromEntries(capsEntries);

console.log(capsPopulations);


4
在这里你还可以使用解构:entries.map(([k, v]) => [k[0].toUpperCase() + k.slice(1), v]) - Scott Sauyet

4

1

这将会帮助你:

const griddata = [
  {
      "id_pk": 238,
      "acT_ID": 238,
      "desc": "Record 2",
      "parent": 0,
      "compdays": 5,
      "logical": "1",
      "quantity": "1",
      "lisT_ID": 75,
      "empL_ID": 1388,
      "default": 8,
      "level": "0",
      "sortorder": 2,
      "vfpRecNo": 0,
      "isDeleted": false,
      "clientID": 1,
      "empl_num": "1388",
      "duedate": "05/04/2022"
  }
]

const upperCaseKeys = (data) => {
    debugger;
    let gridData = [];
    if (data != null && data != undefined && data.length > 0) {
      let keys = Object.keys(data[0]);
      let upperCaseKey = [];

      for (let j = 0; j < data.length; j++) {
        upperCaseKey = [];
        for (let i = 0; i < keys.length; i++) {
          set(upperCaseKey, keys[i].toUpperCase(), data[j][keys[i]]);
        }
        upperCaseKey.push(...upperCaseKey);

        gridData.push(Object.assign({}, upperCaseKey));
      }
    }
    console.log("upperCaseKeys",gridData)
  }

const set = (obj, prop, value) => {
    obj[prop] = value;
}

upperCaseKeys(griddata)

输出:

upperCaseKeys [
  {
    ID_PK: 238,
    ACT_ID: 238,
    DESC: 'Record 2',
    PARENT: 0,
    COMPDAYS: 5,
    LOGICAL: '1',
    QUANTITY: '1',
    LIST_ID: 75,
    EMPL_ID: 1388,
    DEFAULT: 8,
    LEVEL: '0',
    SORTORDER: 2,
    VFPRECNO: 0,
    ISDELETED: false,
    CLIENTID: 1,
    EMPL_NUM: '1388',
    DUEDATE: '05/04/2022'
  }
]

1
在我的情况下,这段代码很好用。使用 map 函数时,无论是大写还是小写都可以:

转成大写:

const newDataUpperCase = data.map( function( item ){
        for(var key in item){
            var upper = key.toUpperCase();
            if( upper !== key ){ 
              item[ upper ] = item;
                delete item[key];
            }
        }
        return item;
    });

转换为小写:

const newDataUpperCase = data.map( function( item ){
        for(var key in item){
            var lower= key.toLowerCase();
            if( lower!== key ){ 
              item[ lower] = item;
                delete item[key];
            }
        }
        return item;
    });

0

如果你只需要将首字母大写,可以使用Jeremiah的回答

或者如果你需要将每个单词的首字母都大写,可以考虑以下方法

let populations = {"london": 8.9, "beijing": 21.54, "mumbai": 18.41, "new york": 19.4};
let entries = Object.entries(populations);
// Capitalize first letter of each word 
let capsEntries = entries.map((entry) => [entry[0].replace(/(^\w{1})|(\s+\w{1})/g, letter => letter.toUpperCase()), entry[1]]);
let capsPopulations = Object.fromEntries(capsEntries);

console.log(capsPopulations)

正则表达式采用自这个答案

正则表达式解释

  1. (^\w{1}):匹配字符串的第一个字符
  2. |:或
  3. (\s{1}\w{1}):匹配一个紧随一个空格后出现的字符
  4. g:全部匹配
  5. 匹配 => match.toUpperCase():replace函数可以接受函数作为参数,所以将匹配项替换为大写的匹配项

0
    const transform = (arrObj) => {
    let newObj=[];
    for(let obj of arrObj) {
      let temp=new Object();
      let keys = Object.keys(obj);
      let values = Object.values(obj);
      let i=0;
      keys.forEach(key => {
          key=key[0].toUpperCase() + key.slice(1);
          temp[`${key}`]=values[i++];
      });
      newObj.push(temp);
    }
    return newObj;
  };
  const arrObj = [{first: 'satya', last:'prakash'}, {college: 'AIT'}];
  console.log(transform(arrObj));
  

-5

使用 Lodash 的 _.capitalize 函数

_.capitalize('firstName') => FirstName


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