2013-06-04 3 views
0

Вот что мне нужно сделать. У меня есть объект, который идетУдалить атрибуты объекта JavaScript, такие как

{"MainASubB":"AB","MainBSubC":"BC"...} 

Каждый раз в то время я должен принять все атрибуты, которые начинаются Майна до ввода в новом атрибуте исходного Майна. В приведенном выше примере преобразования объекта будет

{"MainASubB":"AB","MainBSubC":"BC"...} => 
{"MainBSubC":"BC"...} => //MainASubB has now been taken out 
{"MainASubD":"AB","MainBSubC":"BC"...}; A new MainA group attribute, MainASubD has now been added. 

Я знаю, что Javascript удалить можно сделать, но сама по себе я не думаю, что это вполне берет меня весь путь там. Я должен отметить, что

  1. Время от времени не может быть атрибута группы MainA, присутствующего в первую очередь.
  2. При условии, что код работает по назначению, никогда не может быть более одного атрибута группы MainA.

Stringifying объект, очищая строку по мере необходимости, а затем де-stringifying его, а затем, наконец, положить в новый атрибут Майна группы, конечно, возможно, но мне интересно, если есть другой techique, возможно, один полагаться на JQuery ?, это ускорит меня.

+0

Вы ищете 'оператора delete'. – SLaks

+0

Что случилось с 'delete'? Где еще вам нужно взять вас? – deceze

+0

Возможно, вы ищете 'jQuery.extend' [http://api.jquery.com/jQuery.extend/] –

ответ

1

Вот общая функция:

function removeProperties (obj, prop) { 
    Object.keys (obj).forEach (
    function (p) { 
     if (typeof prop === 'string' ? p.indexOf (prop) == 0 : prop.test (p)) 
     delete obj[p]; 
    }); 
    return obj; 
} 

Параметр obj является объектом wheich вы хотите удалить свойства из. Параметр prop может быть строкой, например 'MainA', и в этом случае любые свойства с именами, начинающимися с этой строки, будут удалены. Если 'prop является регулярным выражением, то любые свойства, имена которых соответствуют ему, будут удалены.

Устранение сделано на месте, т.е. obj сам изменен, он также возвращается в результате выполнения функции.

в действии здесь: http://jsfiddle.net/jstoolsmith/EpSxC/

+0

Спасибо. Я на самом деле придерживаюсь простой итерации, но мне нравится ваша общая функция, поэтому я принимаю ваш ответ. – DroidOS

+0

Спасибо. Я всегда стараюсь писать общие функции, это облегчает повторное использование. – HBP

3

Вы должны перебрать свойства, сравнивать каждое имя, а затем delete свойство:

for (var prop in obj) { 
    if (prop.indexOf('MainA') === 0) { // property name starts with 'MainA' 
     delete obj[prop]; 
     break; // since there can be only one 
    } 
} 

Я бы не использовать такие имена «иерархический» собственность, хотя. Почему бы не использовать вложенные объекты и просто переписать значение по своему усмотрению?

Например:

var obj = { 
    MainA: { 
     SubA: '...' 
    }, 
    MainB: { 
     SubA: '...' 
    } 
}; 

, а затем это просто:

obj.MainA = {SubD: '...'}; 

или просто добавить "суб" значение:

obj.MainA.SubD = '...'; 

Это будет более гибкой в ​​долгосрочной перспективе запустить.

+0

Спасибо. Итерация - это, безусловно, возможность - на самом деле это то, что я сейчас делаю. Я поставил вопрос в надежде, что кто-то здесь может предложить более аккуратное решение. Что касается имен атрибутов иерархического объекта - я мало контролирую это. Это не может быть хорошей идеей в целом, но в контексте того, где это используется, это не только единственное решение, но и идеальное. – DroidOS

+1

@DroidOS: Нет другого разумного решения, кроме повторения имен свойств. Вы можете сохранить дополнительный объект, который содержит сопоставление имени свойства 'префикс ->. 'var prefix_map = {MainA: 'MainASubA'};'. Тогда вам больше не придется перебирать, но вы должны сохранить карту. –

Смежные вопросы