3

我对 JavaScript 比较陌生,所以如果这很愚蠢/不可能,请原谅我,但我正在尝试标准化 JavaScript 对象中的属性名称。例如,我有这样的代码

var object = {
    "firstName": "Joe",
    "MiddleName": "Roy",
    "last_name": "Fool"
}

我想创建一个具有属性名称 firstName、middleName 和 lastName 的新对象。有没有办法搜索这些属性,看看哪些是违规的?否则,我总是可以只制作一个完整的副本,但这将是非常低效的。谢谢

4

3 回答 3

1

这可能超出了您的要求,但是将下划线分隔的命名转换为驼峰式命名非常容易;您可以迭代您的对象并生成一个具有正确名称的新对象:

var converter = /_(\w)/g, lowerFirst = /^(\w)/;
function convertName(name) {
  if (converter.test(name)) {
    name = name.toLowerCase().replace(converter, function ($0, $1) {
             return $1.toUpperCase();
           });
  } else {
    // correct a first letter being uppercase
    name = name.replace(lowerFirst, function ($0, $1){ return $1.toLowerCase(); });
  }

  return name;
}

var hasOwnProperty = Object.prototype.hasOwnProperty,
    toString = Object.prototype.toString;

function isPlainObject(obj) {
  return toString.call(obj) === '[object Object]';
}


function convertObject(obj) {
  var k, output = {};
  for(k in obj) {
    if (hasOwnProperty.call(obj, k)) {
      output[convertName(k)] = isPlainObject(obj[k]) ? convertObject(obj[k]) : obj[k];
    }
  }

  return output;
}

如果属性名称已经是驼峰式,则它们不会被正则表达式更改。

于 2013-06-27T19:01:09.340 回答
0

通过您的示例,一种快速方法是将属性值映射到带有字典的第二个对象,以选择通过(例如)获得的属性名称Object.getOwnPropertyNames

var object = {"firstName": "Joe", "MiddleName": "Roy", "last_name": "Fool"};

var p = Object.getOwnPropertyNames(object), // ["firstName", "MiddleName", "last_name"]
    dict = {
        'firstname': 'firstName',
        'first_name': 'firstName',
        'middlename': 'middleName',
        'middle_name': 'middleName',
        'lastname': 'lastName',
        'last_name': 'lastName'
    },
    o2 = {}, i;

for (i = 0; i < p.length; ++i) {
    o2[dict[p[i].toLowerCase()] || p[i]] = object[p[i]];
}

o2; // {firstName: "Joe", middleName: "Roy", lastName: "Fool"}
于 2013-06-27T18:53:52.103 回答
0

你可能会做这样的事情。

第一个replace可用于替换您想要作为大写骆驼外壳标记的任何字符。

第二个replace在标记后面的字母上执行骆驼大小写。

最后replace确保标识符的第一个字母是小写的。

standardisePropertiesobject使用camelCase. _ 但是您也可以让它返回新对象standardised

如果一个名称由于已经存在而不能使用,则使用原来的名称。

我没有花太多时间在这方面,很可能会有优化,或者您可能希望稍微更改规则。

Javascript

function camelCase(string) {
    return string.replace(/[-+]/g, "_").replace(/_([\da-z])/gi, function (all, letter) {
        return letter.toUpperCase();
    }).replace(/^([A-Z])/, function (all, letter) {
        return letter.toLowerCase();
    });
}

function standardiseProperties(object) {
    var standardised = {},
        newName,
        i;

    for (i in object) {
        if (object.hasOwnProperty(i)) {
            newName = camelCase(i);
            if (standardised.hasOwnProperty(newName)) {
                standardised[i] = object[i];
            } else {
                standardised[newName] = object[i];
            }

            delete object[i];
        }
    }

    for (i in standardised) {
        object[i] = standardised[i];
    }
}

var object = {
    "firstName": "Joe",
    "MiddleName": "Roy",
    "last_name": "Fool"
};

console.log(object);
standardiseProperties(object);
console.log(object);

输出

Object {firstName: "Joe", MiddleName: "Roy", last_name: "Fool"}
Object {firstName: "Joe", middleName: "Roy", lastName: "Fool"} 

jsfiddle 上

于 2013-06-27T19:46:43.837 回答