2013-06-04 96 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组属性。

字符串化的对象,清理出字符串作为需要,然后去字符串化,然后终于在新麦纳组属性将肯定是可能的,但我想知道是否有另一种的己技巧,也许一个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'};'。那么你不必迭代,但你必须保持地图。 –