在JavaScript属性名称中搜索字符

时间:2013-06-27 18:45:42

标签: javascript

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

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

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

3 个答案:

答案 0 :(得分:1)

这可能超出了你想要的范围,但将下划线分隔的命名转换为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不会更改它们。

答案 1 :(得分: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"}

答案 2 :(得分:0)

你可能会做这样的事情。

第一个replace可用于替换您想要成为上套骆驼套管标记的任何字符。

第二个replace在标记后面的字母上执行骆驼外壳。

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

standardiseProperties使用object的规则在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