簡體   English   中英

使用虛線字符串創建JavaScript對象

[英]Create javascript object using dotted string

假設我有一些javascript對象,例如var person = {};

我得到了一個字符串,該字符串表示對該對象的虛線遍歷,例如“ Address.Suburb”

另一個字符串表示要設置的值。 例如“您的小鎮”

有什么通用功能可以設置此功能。 這些屬性在調用之前可能存在也可能不存在,如果需要,函數將需要創建屬性。

function MySetter(object, stringTraversal, valueToSet) {
    ....
}

這樣

var person = {};

MySetter(person, "Address.Suburb", "CrazyTown")

alert(person.Address.Suburb); // alerts CrazyTown

謝謝。

嘗試:

function setObjPath(obj,path,value){
  var parts = path.split('.'), part;

  function error(txt){
      throw new TypeError(txt);
  }

  while (part = parts.shift()){
    if (parts.length){
        obj = part in obj && obj[part] instanceof Object 
              ? obj[part] 
              : part in obj 
                ? error('key ['+part+'] exists but is not an object') 
                : (obj[part] = {}, obj[part]);
    } else {
       obj[part] = value;
    }
  }
}
// usage examples
var person = {name: {prename: {first:'Pete',full:'Pete Michael'}}};

setObjPath(person, 'name.surname.first','Johansen');
alert(person.name.prename.first +' '+person.name.surname.first);
 //=> Pete Johansen

setObjPath(person, 'name.prename.first','George');
alert(person.name.prename.first+' '+person.name.surname.first);
 //=> George Johansen

setObjPath(person, 'name.prename.first.isset',true);
 //=> throws TypeError

不好意思的命名

function MySetter(obj, path, value){
      var paths = path.split(".");
      var path;
      var ans;
      for(var i in paths) {
                obj = obj[paths[i]];
      };
      return ans;
}

編輯::我誤解了我所想的問題。 這將返回字符串路徑中的值,您是否要設置它?

function MySetter(object, string, value) {
    if (typeof string === 'string') {
        string = string.split('.');
    }

    if (typeof object[string[0]] === 'object')
        return MySetter(object[string[0]], string.slice(1), value);
    else
        return object[string[0]];
}

這應該夠了吧!

編輯:是的,我也誤會了它…

function MySetter(object, string, value) {
    if (typeof string === 'string') {
        string = string.split('.');
    }

    if (string.length === 2) {
        object[string[1]] = value;
    } else {
        return MySetter(object[string[0]], string.slice(1), value);
    }
}

您可以嘗試編寫自己的解析器。

function MySetter(object, stringTraversal, valueToSet) {
    var prop = stringTraversal.split('.'),
        len = prop.length,
        obj = object,
        attr = null;
    for (var i = 0; i < len; i++) {
         attr = prop[i];
         if (i == len - 1) {
             obj[attr] = valueToSet;
             return;
         }
         if (!obj[attr] && i < len - 1) {
             obj[attr] = {};
         }
         obj = obj[attr];
    }
}

這樣的事情(沒有時間進行測試)。

function MySetter(object, stringTraversal, valueToSet) {
    var pieces = stringTraversal.split('.');

    for(var i in pieces) {
        var val = {};
        if(i == pieces.length-1) {
            val = valueToSet;
        }
        object[pieces[i]] = val;
        object = object[pieces[i]];
    }
}

var person = {};

MySetter(person, "Address.Suburb", "CrazyTown")

alert(person.Address.Suburb); // alerts CrazyTown

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM