【问题标题】:Push to a javascript array if it exists, if not then create it first如果存在则推送到 javascript 数组,如果不存在则先创建它
【发布时间】:2014-02-18 16:07:18
【问题描述】:

有没有办法让这条线始终工作而不抛出TypeError: Cannot read property 'Whatever' of undefined

var MyArray = [];
MyArray[StringVariableName][StringVariableName2].push("whatever");

【问题讨论】:

  • MyArray = MyArray || [];

标签: javascript arrays object


【解决方案1】:

试试这个:

var MyArray = [];
MyArray[StringVariableName] = MyArray[StringVariableName] || [];
MyArray[StringVariableName][StringVariableName2] = MyArray[StringVariableName][StringVariableName2] || [];
MyArray[StringVariableName][StringVariableName2].push("whatever");

【讨论】:

  • 效果很好,你能解释一下这个作业是什么意思吗?
  • @NadavMiller 这只是一个逻辑或。如果第一部分为真,则不执行第二部分并将第一部分分配给变量。
  • 这是逻辑或运算符,它简单地说:如果左操作数是真值,则返回它,否则返回右操作数。
【解决方案2】:

您甚至可以通过表达式的力量,用单行线做到这一点。

(MyArray[StringVariableName][StringVariableName2] || (MyArray[StringVariableName][StringVariableName2] = [])).push("whatever");

【讨论】:

  • 这太棒了。这种方法是否存在性能滞后?
【解决方案3】:

你可以使用文字语法来设置你想要的东西:

var myObj = {
    StringVariableName: {
        StringVariableName2: []
    }
};

myObj.StringVariableName.StringVariableName2.push("whatever");

【讨论】:

  • 你做错了,因为 StringVariableName 看起来实际上是一个变量名。您正在将它们作为对象中的常量键。
【解决方案4】:

如果您的键不是整数,我认为首先不要使用数组,而是使用对象。 在Javascript中数组也是对象所以这样做并没有错

var a = [];
a['key'] = 'something';

console.log(a); //Gives []

我认为这在概念上是错误的所以,您应该使用对象而不是使用 Array 来保存这样的数据对。看到这个:

var myObject = myObject || {};
myObject[str1] = myObject[str1] || {};
myObject[str1][str2] = myObject[str][str2] || [];

// Now myObject[str1][str2] is an array. Do your original operation

myObject[str1][str2].push("whatever");

【讨论】:

  • .push() 用于数组,而不是对象。
  • @A__ 我们俩都是正确的,因为myObject[str1][str2] 是一个数组,而不是一个对象。
【解决方案5】:

在不出错的情况下进行检查:

此 sn-p 允许您检查是否存在链接对象。

var x;
try{x=MyArray[name1][name2][name3][name4]}catch(e){}
!x||(x.push('whatever'));

来自

https://stackoverflow.com/a/21353032/2450730

在 Javascript 中创建对象链的简写

此函数允许您使用简单的字符串创建链接对象。

function def(a,b,c,d){
 c=b.split('.');
 d=c.shift();//add *1 for arrays
 a[d]||(a[d]={});//[] for arrays
 !(c.length>0)||def(a[d],c.join('.'));
}

用法

var MyArray={};//[]
def(MyArray,'name1.name2.name3.name4');//name1+'.'+name2....

来自

https://stackoverflow.com/a/21384869/2450730

两者都适用于具有简单更改的数组。将{} 替换为[]

如果您有任何问题,请尽管提出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-20
    • 2010-11-18
    • 2013-05-26
    • 2016-09-18
    • 1970-01-01
    • 2014-05-21
    • 2012-02-04
    • 1970-01-01
    相关资源
    最近更新 更多