2014-12-03 58 views
1

我遇到了将对象推送到对象上的问题。我成功地将一个数组推到了对象上,但是我失败了。将对象推到对象上

这是我

var lapList = [1,2,3,4]; 
var users = [{sets: [{ 
         reps: [] 
         }] 
        }, 
        {sets: [{ 
         reps: [] 
         }] 
        }]; 

var activeUser = users[0]; 
var activeSet = activeUser.sets[activeUser.sets.length-1]; 

activeSet.reps.push({laps: lapList}); 
console.log('good'); 
console.log(users); 

activeSet.push({reps: [{laps: lapList}]}); 
console.log('also good'); 
console.log(users); 

我在控制台中的第一个“好”,我可以看到阵列得到了成功添加到用户。然而,在第二个测试中,我试图添加一个新的代码段,它失败了,我得到一个TypeError:undefined不是函数。

有什么想法?

+1

这甚至意味着什么?对象不是数组,也没有推送的概念。 – SLaks 2014-12-03 01:07:43

回答

3

我想你的结构不正确定义:

用户的样子:

[ 
    {sets: [{reps: []}]}, 
    {sets: [{reps: []}]} 
]; 

这是两个对象数组作为值

activeUser是数组中的第一个对象,并看起来像:

{sets: [{reps: []}]} 

activeSet只是代表,一个数组

你的第一个电话:

activeSet.reps.push({laps: lapList}); 

这将做工精细,

你的第二个电话:

activeSet.push({reps: [{laps: lapList}]}); 

这是毫无意义的,因为活跃集为代表的对象

你可以把它推到activeUser.sets,这可能是你真正打算的

activeUser.sets.push({reps: [{laps: lapList}]}); 
+0

太棒了!我认为这接近我想要的。还有一个问题 - 如果我想添加一个全新的集合呢?我似乎无法做activeUser.push({sets:[{reps:[{laps:lapList}]}]});这里是一个小提琴 - http://jsfiddle.net/bL9Lfyyy/ – darudude 2014-12-03 01:49:45

+0

再看看我刚才给你看的结构。 ActiveUser是一个对象,用户是你的数组 – 2014-12-03 01:52:34

+0

知道了 - 我只是困惑,并试图做一个级别太高。这是我需要的答案 – darudude 2014-12-03 02:23:21

0

正如在评论中提到的,JS对象没有push方法。

您可能需要做这样的事情:

activeSet.reps.push({laps: lapList});

也许

activeSet.reps = [{laps: lapList}];

我不完全相信你有这个数据结构建模什么,但这些是你应该能够用一个对象完成的事情的类型。

+0

我想要做的是添加另一个全新的代表部分。提供的解决方案都取代了代表部分(我正在使用上面列出的演示代码中的第一个)。 – darudude 2014-12-03 01:25:17

+0

本质上,我从服务获取新数据,并且需要更新用户数组。当它增加一圈的问题时,它的作用就像一个阵列。但是,有些情况下我需要创建代表的“子对象”来处理不同的数据,这就是我被卡住的地方 – darudude 2014-12-03 01:26:31

+0

可能有更好的方法来组织数据。你能想出其他方式来构建它吗? – thataustin 2014-12-03 01:55:16

0

activeSet是一个对象。 activeSet.reps是一个数组。 push是一个数组方法。

推新对象数组

activeUser.sets.push({reps:{laps: lapList}}); 
0

对象不具有推方法,他们确实有在如何可以在他们虽然环这有时会引起混淆的相似性。当你用新属性扩展一个对象时,就是这样,你可以在对象上声明属性。像这样的作品

//objects value is {prop1: "value1"} 
var obj = {prop1: "value1"} 

//objects value is now {prop1: "value1", prop2: "value2"} 
obj.prop2 = "value2" 

我得到你可能使用了错误的结构,虽然在这里为您所要完成的感觉。如果您发布了期望的最终数据结构示例,我们可以更好地为您提供帮助。

0

当通过Firefox的控制台输入此代码时,我遇到类似的错误:TypeError: activeSet.push is not a function。啊!有问题! Object对象没有像.push()方法那样的东西。当你做这个时,你可能已经进入阵列激光聚焦模式;)。 Array的.push()方法的概念是为数组添加一个名称非特定值。这不是Object的方法之一,因为任何给定对象的每个值都必须有一个(有意义的)名称;把一个非指定的价值放到一个对象中,好吧,把可怜的东西混淆了。相反,尝试:

activeSet.reps = [{laps: lapList}]; 

而且,当我把这个通过控制台再次...

"good" 
Array [ Object, Object ] 
"also good" 
Array [ Object, Object ] 

瞧!希望能帮助到你!