在JavaScript属性名称中搜索字符

在JavaScript属性名称中搜索字符,javascript,Javascript,我对JavaScript比较陌生,所以如果这很愚蠢/不可能,请原谅我,但我正在尝试标准化JavaScript对象中属性的名称。例如,我有如下代码 var object = { "firstName": "Joe", "MiddleName": "Roy", "last_name": "Fool" } 我想创建一个具有属性名firstName、middleName和lastName的新对象。有没有办法搜索这些属性,看看哪些属性违反了规定?否则,我总是可以完全复制,但这将是

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

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

我想创建一个具有属性名firstName、middleName和lastName的新对象。有没有办法搜索这些属性,看看哪些属性违反了规定?否则,我总是可以完全复制,但这将是相当低效的。感谢您的示例,一种快速的方法是使用字典将属性值映射到第二个对象,以选择属性名称,通过(例如)获得

var object={“firstName”:“Joe”,“MiddleName”:“Roy”,“last_name”:“傻瓜”};
var p=Object.getOwnPropertyNames(对象),//[“firstName”、“MiddleName”、“last_name”]
dict={
“firstname”:“firstname”,
“名字”:“名字”,
“中间名”:“中间名”,
“中间名”:“中间名”,
“lastname”:“lastname”,
“姓氏”:“姓氏”
},
o2={},i;
对于(i=0;i
这可能超出了您想要的范围,但是将下划线分隔的命名转换为camelcase非常容易;您可以迭代对象并生成具有正确名称的新对象:

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;
}

如果属性名已经在camelcase中,则regexp不会更改它们。

您可以执行类似的操作

第一个
replace
可用于替换要作为大写驼峰式大小写标记的任何字符

第二个
replace
对标记后面的字母执行驼峰式大小写

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

standardiseProperties
使用
camelCase
的规则在
对象上工作。但您也可以让它返回新对象
标准化的

如果名称已存在,无法使用,则使用原始名称

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

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"} 

上,“我想制作一个新对象”总是一个完整的副本,你还想到了什么?你不知道哪些是违反的,对吗?您正在寻找某种语言解析器?这个问题回答了如何迭代对象的错误属性名称:确切地说,语言解析器将是一个很好的方法。这个提琴可以用于您的示例,但它不会将lastname更改为lastname,但它是一个start。这不会修复
convertName('MiddleName');//“MiddleName”
这不在OPs示例中,但您也会得到
convertName('MIDDLE_NAME');//“mIDDLENAME”
通过先测试下划线,试图变得更健壮一些;除了OP的示例之外,很难编写太多代码,因为完全错误的camelcase输入很难/不可能用regexp进行纠正。我介绍的唯一格式是大写首字母,camelcase,还有下标…我在想,在我处理完下标之后,我也许可以通过小写解析器运行这些属性的第一个字母。你似乎在
if(converter.test(name){
中缺少一个
Object {firstName: "Joe", MiddleName: "Roy", last_name: "Fool"}
Object {firstName: "Joe", middleName: "Roy", lastName: "Fool"}