Построение иерархии объектов из строки 'namespace' - PullRequest
2 голосов
/ 22 февраля 2010

Я пытаюсь написать функцию, которая принимает строку, представляющую пространство имен (например, «MyCompany.UI.LoginPage»), и определяет каждый сегмент пространства имен как объект, если он еще не существует. Например, если бы «MyCompany.UI.LoginPage» не был объектом, он оценил бы это:

MyCompany = {};
MyCompany.UI = {};
MyCompany.UI.LoginPage = {};

Я хотел бы сделать это, перечисляя каждый символ аргумента «пространство имен» (строка) и определяя каждый объект, когда перечисление достигает символов периода.

Как я могу перечислить символы строки в JavaScript?

Ответы [ 2 ]

4 голосов
/ 22 февраля 2010

Вы можете получить доступ к символам строки напрямую по ее индексу, используя метод String.prototype.charAt:

var str = "foo";
for (var i = 0; i < str.length; i++) {
  alert(str.charAt(i));
}

Но я не думаю, что вы хотите проходить строку пространства имен символ за символом, вы можете использовать метод String.prototype.split, чтобы получить массив, содержащий уровни пространства имен с использованием символа точки (.) в качестве разделителя, например:

var levels = "MyCompany.UI.LoginPage".split('.');
// levels is an array: ["MyCompany", "UI", "LoginPage"]

Но я думаю, что ваш вопрос идет дальше к этому, и я дам вам более сложную отправную точку, я сделал рекурсивную функцию, которая позволит вам делать именно то, что вы хотите, инициализировать несколько вложенных объектов уровни с использованием строки:

Использование:

initializeNS('MyCompany.UI.LoginPage');
// that will create a MyCompany global object

// you can use it on an object to avoid globals also
var topLevel = {};
initializeNS('Foo.Bar.Baz', topLevel);

// or
var One = initializeNS('Two.Three.Four', {});

Реализация:

function initializeNS(ns, obj) {
  var global = (function () { return this;})(), // reference to the global object
      levels = ns.split('.'), first = levels.shift();
  obj = obj || global; //if no object argument supplied declare a global property
  obj[first] = obj[first] || {}; // initialize the "level"
  if (levels.length) { // recursion condition
    initializeNS(levels.join('.'), obj[first]);
  }
  return obj[first]; // return a reference to the top level object
}

Вам нужно улучшить эту функцию, например, вам нужно очистить строку ...

1 голос
/ 22 февраля 2010

Преобразовать строку в массив символов с помощью этого кода:

var $letterArray = [];

for (var $i = 1; $i <= $yourString.length; $i++)
{
    $letterArray[$i] = $yourStringtring.substring(($i - 1), $i);
}

Затем вы можете перечислить каждый символ в строковом массиве $letterArrary

...