Javascript 如何在不声明的情况下使用新数组扩展数组

Javascript 如何在不声明的情况下使用新数组扩展数组,javascript,Javascript,我正在做一个项目,我需要从API返回的json数据中维护一个数组,json可以有树,我有下面的代码,工作正常,但我想在给数组元素赋值之前删除if条件 // data contains json let newArray = [] for(let d in data){ for(let x in data[d]){ if(typeof(newArray[d]) === 'undefined'){ newArray[d] = [] }

我正在做一个项目,我需要从API返回的json数据中维护一个数组,json可以有树,我有下面的代码,工作正常,但我想在给数组元素赋值之前删除if条件

// data contains json 
let newArray = []
for(let d in data){
    for(let x in data[d]){
        if(typeof(newArray[d]) === 'undefined'){
            newArray[d] = []
        }
        if(typeof(newArray[d][data[d][x]['id']]) === 'undefined'){
            newArray[d][data[d][x]['id']] = []
        }
        newArray[d][data[d][x]['id']]['price'] = data[d][x]['price']
        newArray[d][data[d][x]['id']]['discount'] = data[d][x]['discount']
    }
}
在上面的代码中,我必须首先检查数组并将其声明为数组,否则它将返回未定义的错误,有没有办法消除这些条件并根据需要扩展数组?

newArray[d]=newArray[d]| |[]

或者使用Lodash图书馆


您可以像这样使用新的ES6 spread运算符

newAraay[d] = [...newArray,...Array(data[d][x]['id']),[...Array('price',data[d][x]['price'])]]

就像在这段代码中一样,我直接做的是
abc[1][3][4]=“new value”
,而没有显式初始化它们

让abc=[];
abc[1]=[…abc,…数组(3),[…数组(4),'新插入值']]

控制台日志(abc)
newArray[d]
看起来可疑。我希望
newArray
不会成为稀疏数组?(如果是这样,请改用对象)通过将重复表达式存储在变量中,您可以使代码更加枯燥。您似乎将数组用作普通对象。什么是
数据[d][x][id']
?它是一个字符串还是一个数字?@Titus它可以是字符串或数字中的任何东西,我用
let newArray={}
检查过,但它有相同的问题它首先应该是一个对象,而不是数组。JavaScript允许您执行以下操作:
let arr=[];arr['prop1']='val1'没有抱怨。但问题在于序列化。如果您尝试
JSON.stringify()
这样做,结果中将只保留类似数字的索引。对于存储键值对,有对象文字(
{key1:'value1'}
),这就是您应该在这里使用的内容。关于你的情况,如果你期望
let o={};o、 prop1.prop2='val1'
将创建
{prop1:{prop2:'val1'}}
,然后答案是否定的,如果没有额外的努力,你不能这样做。@SebastianKaczmarek感谢你的解释,在我的情况下,使用条件似乎是唯一的解决方案,但是我可以在其他地方尝试使用对象,尽管这是一次声明,我希望能够赋值,它也可以在第一级元素上工作,但不适用于像newArray[d][e][f]这样的内部元素。如果我想赋值,它应该是:
abc[1]=[…abc,…Array(3),[…Array(4),'newinserted value']
。否则,当您尝试执行以下操作时:
abc[1]=[…数组(2),[…数组(4),“新插入值”]]
在第一次尝试后,它将overridden@SebastianKaczmarek您的意思是abc将被覆盖吗?如果您尝试执行
abc[1][3][4],则不会覆盖整个数组,但
1
索引将被覆盖='newvalue'
然后
abc[1][2][3]='anothervalue'
是的,你是对的!我将编辑anwer,Thanx:)