一次更新多个数组元素Javascript

时间:2011-11-28 02:11:04

标签: javascript

我试图在多维数组/对象中一次更新多个元素,并且我尝试过.push和其他选项的错误。

 var FEtypes= {
    textTemplate: {
       type :"Text",
       size : 50,
       required : "no",
       FEadd : '<input>', 
       label : 'Label',
       top : 0, 
       left : 0
    }, 
    textareaTemplate: {
       type : "Textarea",
       cols : 30,
       rows : 5,
       FEadd :'<textarea>' 
    }
 }

这样可行,但尝试在一行中完成。

 FEtypes[1].left = someVariable1;
 FEtypes[1].top = someVariable2;

我没有成功:

 FEtypes[1].push( {left:someVariable1, top:someVariable2} );

我一直收到一个错误,这不是一个函数,或者什么也没做。

4 个答案:

答案 0 :(得分:5)

FEtypes是一个对象,而不是一个数组。 Push仅适用于阵列。

如果要将此结构存储在数组中,它将类似于:

var FEtypes= [
      {type :"Text", size : 50,  required : "no", FEadd  :'<input>', label : 'Label', top : 0, left : 0}, 
      {type : "Textarea", cols : 30,  rows : 5,FEadd :'<textarea>' }
];

然后

FEtypes[1].left = someVariable1;
FEtypes[1].top = someVariable2;

如果您想一次修改多个属性,jQuery extend函数将为您提供所需的内容:

$.extend(FEtypes[1], {left:someVariable1, top:someVariable2});

但我认为你的原始结构更合适。只是放弃阵列,并执行此操作:

FEtypes.textareaTemplate.left = someVariable1;
FEtypes.textareaTemplate.top = someVariable2;

或者,再一次,jQuery只有一行:

$.extend(FEtypes.textareaTemplate, {left:someVariable1, top:someVariable2});

答案 1 :(得分:2)

FEtypes是一个对象,它有两个属性textTemplatetextareaTemplate。它不是数组,也没有属性[1]。因此,您无法使用.push()[1]

访问.left.top参数或textareaTemplate属性的正确方法是:

FETypes.textareaTemplate.left = someVariable1;
FETypes.textareaTemplate.top = someVariable2;

textTemplate,就是这样:

FETypes.textTemplate.left = someVariable1;
FETypes.textTemplate.top = someVariable2;

textareaTemplatetextTemplate属性都是对象。如果要替换整个对象(从而替换对象上的所有其他属性),可以执行以下操作:

FETypes.textTemplate = {left: someVariable1, top: someVariable1};

但是,在执行此操作时,您将替换整个textTemplate属性,以便除了lefttop之外没有其他属性。任何先前的属性(如sizerequired)都会被新的作业消除。

如果您只想更新lefttop属性而将其他属性保留在适当的位置,则必须单独分配 - 除非您编写一个函数来执行此操作,否则没有快捷方式:

function updatePosition(obj, leftPos, topPos) {
    obj.left = leftPos;
    obj.top = topPos;
}

然后像这样调用该函数:

updatePosition(FETypes.textareaTemplate, someVariable1, someVariable2);

答案 2 :(得分:0)

FEtypes 会引用Array个实例。因此,它没有1属性,undefinedFEtypes[1]的结果根本没有属性。你的代码没有,不能工作。检查错误控制台。

答案 3 :(得分:0)

使用lodash或下划线尝试:

_.chain(FEtypes).map(item => {
      item.left = item.type === "Text" ? someVariable1 : item.left;
      item.top = item.type === "Text" ? someVariable2 : item.top;
      return item;
    });