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
于 2013-06-27T18:53:52.103 に答える
0

このようなことができるかもしれません。

1 つ目replaceは、大文字のキャメル ケースのマーカーにする任意の文字を置き換えるために使用できます。

2 つ目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 に答える