【问题标题】:Javascript object/array manipulationJavascript对象/数组操作
【发布时间】:2015-12-18 19:05:04
【问题描述】:

在一些 javascript 数组操作/更新方面苦苦挣扎。希望有人能帮忙。

我有一个数组:

 array('saved_designs'=array());

Javascript JSON 版本:

 {"saved_design":{}}

我将添加一个标签,以及相关的数组数据:

 array("saved_designs"=array('label'=array('class'='somecssclass',styles=array(ill add more assoc elements here),'hover'=array(ill add more assoc elements here))))

Javascript 版本:

 {"saved_designs":{"label":{"class":"someclass","style":[],"hover":[]}}}

我希望能够附加/修改这个数组。如果“标签”已经定义...然后循环遍历该元素的子数据...并更新。如果 'label' 不存在..然后将新数据集附加到 'saved_designs' 数组元素。

因此,如果未定义标签,请将以下内容添加到 'saved_designs' 元素:

 array('label2' = array('class'=>'someclass2',styles=array(),'hover=>array()')

事情并没有像我预期的那样顺利。我不确定 [] 和 {} 的 javascript 表示法及其区别。

可能需要在提供答案时讨论这个问题....但是这是我目前拥有的一些代码来实现这一点:

 //saveLabel = label the user chose for this "design"
 if(isUnique == 0){//update
      //ask user if want to overwrite design styles for the specified html element
      if (confirm("Their is already a design with that label ("+saveLabel+"). Overwrite this designs data for the given element/styles?")) {
           currentDesigns["saved_designs"][saveLabel]["class"] = saveClass;
           //edit other subdata here...
      }
 }else{//create new
      var newDesign = [];
      newDesign[saveLabel] = [];
      newDesign[saveLabel]["class"] = saveClass;
      newDesign[saveLabel]["style"] = [];
      newDesign[saveLabel]["hover"] = [];

      currentDesigns["saved_designs"].push(newDesign);//gives error..push is not defined
 }      
 jQuery("#'.$elementId.'").val(JSON.stringify(currentDesigns));

提前致谢。希望这很清楚。我会根据问题和 cmets 相应地更新。 肖恩

【问题讨论】:

  • 这是通过 PHP 动态编写的 javascript...因此 jQuery("#'.$elementId.'") 部分...考虑到这一点...没有基本的语法错误.
  • 在 JavaScript 中,[] 声明了一个以数字为键的数组,而 {} 声明了一个对象。对象具有可以像具有命名键的数组一样使用的键/属性。
  • -2 我做了什么?!?谢谢托尼...鉴于上面的例子,这个符号应该没问题。
  • 不确定您为什么被否决...任何人,您都可以使用 obj.hasOwnProperty("key") 来检查属性是否存在,您可以分配新属性或覆盖现有属性obj.key=valueobj["key"]=value。要更新一个值,您可以链接键(例如obj["key1"] ["key2"]=value)对不起,如果这不是超级相关。我在打电话,很难回答更长的问题。希望我能帮上忙!

标签: javascript arrays javascript-objects


【解决方案1】:

这可能有点令人困惑。 JavaScript 对象看起来很像来自其他语言的 ma​​pdictionary。您可以遍历它们并使用 object['property_name'] 访问它们的属性。

因此,属性和字符串索引之间的区别并不真正存在。这看起来像您正在创建的 php。它在那里被称为数组,但是您通过字符串识别值这一事实意味着它将被序列化为javascript中的object

var thing = {"saved_designs":{"label":{"class":"someclass","style":[],"hover":[]}}}

thing.saved_designs.labelthing["saved_designs"]["label"] 是一回事。

在 javascript 中,数组是一个只能通过整数索引访问的列表。数组没有显式键,可以定义:

var stuff = ['label', 24, anObject]

因此,您看到有关“未定义推送”的错误是因为就 javascript 而言,您没有处理数组。

currentDesigns["saved_designs"] == currentDesigns.saved_designs

当你有一个对象,并且你想要一个新的键/值对(即属性)时,你不需要添加一个特殊的函数。只需定义键和值:

**currentDesigns.saved_designs['key'] = newDesign;**

如果每个设计都有不同的标签(看起来就是这样),关键是那个标签(一个字符串)。


此外,当您定义新设计时,这是 javascript 所解释的:

  var newDesign = [];

newDesign 是一个数组。它有 n 个由整数索引访问的元素。

  newDesign[saveLabel] = [];

由于 newDesign 是一个数组,saveLabel 应该是一个数字索引。该索引的值是另一个数组。

  newDesign[saveLabel]["class"] = saveClass;
  newDesign[saveLabel]["style"] = [];
  newDesign[saveLabel]["hover"] = [];

这里明确表明您正在尝试将数组用作对象。数组不支持 ['string_key']

这可能非常“有效”,但这只是因为在 javascript 中数组是对象,并且没有规则说您不能随意向对象添加属性。然而,所有这些 [] 根本没有帮助你。

var newDesign = {label: "the label", class: saveClass};

可能是您正在寻找的。​​p>

【讨论】:

  • 非常感谢。那里有一些好的指示......需要重新开始并测试它。我会赞成...这应该会有所帮助(thing.saved_designs.label)。不能投票...我用错了帐户!由于登录错误,意外创建了第二个帐户:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2014-02-13
  • 2021-07-06
相关资源
最近更新 更多