2015-11-02 53 views
-1

我正在为每个公式创建一个对象。公式[0] = start_obj是unixtimestamps,公式1也是unixtimestamps。在某些情况下,我需要切断阵列中的最后一个印章。我尝试使用pop()和splice()方法。两者都引入rangeError。javascript .pop()方法导致范围错误

这是我的代码:

var formel_obj = {} ; 
    formel_obj.start_obj = "change=[ ((x1))>0 ]; start=[ T(find(change)); T(1) ]; res=[start];" ; 
    formel_obj.stop_obj = "change=[ ((x1))<0 ]; stop=[ T(find(change)); T(1) ]; res=[stop];" ; 

var label, formel ; 

for(label in formel_obj) { 
    formel = formel_obj[label] ; 
    this[label] = new Array() ; 
    this[label] = wedge.calc.eval_with_timeaxis(formel, tag_x1, {timebase: interval_length, intervals: [ { start: t_axis_start, end: t_axis_stop } ] })[0] ; // creating for both formel ojects an array from function - see console log 
} 

last=start_obj[Object.keys(start_obj).length - 1] ; 
pre_last=start_obj[Object.keys(start_obj).length - 2] ; 

if (last < pre_last) { 
    console.log(start_obj.length) ; 
    console.log(start_obj) ; 
    start_obj.pop() ;  results in Range error , why? 
} 

阵列(S)从控制台的样子:

>> start_obj 
[1446153600, 1446163200, 1446170400, 1446229200, 1446270600, 1446364200, 1446366600, 1446415200, 1446422400, 1446436200, 1446452400, 1446457200, 1446472200, 1446133800] 
>> stop_obj 
[1446157800, 1446164400, 1446173400, 1446267000, 1446363000, 1446364800, 1446409200, 1446421800, 1446435000, 1446450600, 1446456600, 1446464400, 1446472800, 1446133800] 
>> start_obj[0] 
1446153600 
>> start_obj.length 
14 
>> start_obj.pop() 
is RangeError ..... 

我真的不知道为什么;(

任何想法

EDIT_1:

其运行时阵列,请参阅控制台的屏幕。 Screenshot

EDIT_2:再次

感谢球员,你的要命。我明白这不是一个普通的数组。我写了一个函数,将这个混乱的数组(或以前的东西)转换成一个常规数组。这是商业软件,我没有直接访问这些“后台功能”wedge.what.ever()正在做什么。 无论如何,谢谢大家闪电般的讨论发生在这里。

这里是transformfunction:

function form_reg_array (runtimearray) { 
    var item ; 
    newarray = new Array() ; 
    for (item in runtimearray) { 
     newarray.push(runtimearray[item]) ; 
    } 
    return newarray 
} 

我把它想:

start_obj=form_reg_array(start_obj) 

其转换成规则排列!感谢大家的大声思考。

+1

您的start_obj变量在哪里定义?它是否存在于formel_obj对象上?您可能试图从未初始化的数组中弹出。 –

+0

'wedge.calc.eval_with_timeaxis(...)[0]'返回什么样的数据?你创建一个数组,然后用这个值替换它。如果这实际上不是数组,则不能将其用作数组。 – Guffa

+0

@CameronTinker:'start_obj'变量在循环中创建:'this [label] = ...'其中'label ==“start_obj”'。 – Guffa

回答

2

当我运行下面的代码(从你的例子简体),它的工作原理:

var start = [1446153600, 1446163200, 1446170400, 1446229200, 1446270600, 1446364200, 1446366600, 1446415200, 1446422400, 1446436200, 1446452400, 1446457200, 1446472200, 1446133800] 
 
var end = [1446157800, 1446164400, 1446173400, 1446267000, 1446363000, 1446364800, 1446409200, 1446421800, 1446435000, 1446450600, 1446456600, 1446464400, 1446472800, 1446133800] 
 

 
var element = document.createElement('p'); 
 
element.textContent = end.pop(); 
 
document.body.appendChild(element);

所以错误可能是一个事实,即在你的示例代码,我只能看到formel_obj.start_obj被宣布,而不是实际的start_obj,这将是未知的mea不能pop。为了更好地帮助您,我们需要知道您是否在this的上下文中运行。如果不是,最好使用window来声明,或者,根本就不是这样。如果您使用this来声明它,您还需要需要this来读取它。所以也许使用this.start_obj将工作。

+0

嗷嗷,我一直使用safari作为一个空的小提琴与控制台日志document.write总是看起来如此......未完成。很高兴知道! – somethinghere

+0

(oops,我不小心删除了我的评论,之前阅读过它)document.write可能无法在沙盒环境中工作,如小提琴。 –

+0

在循环中创建'start_obj'和'stop_obj'变量。 – Guffa

2

ES6文档显示pop不会生成Range错误。 ECMA Array.pop

您调用的弹出不是本地数组弹出。您将不得不为该功能提供代码,以便我们提供帮助。同样,因为它不是原生的,你应该能够用调试器进入它并找出问题的根源。

+0

它来自这一行,右:'this [label] = wedge.calc.eval_with_timeaxis(formel,tag_x1,{timebase:interval_length,intervals:[{start:t_axis_start,end:t_axis_stop}]})[0]' - 这一行将它设置为_something_,它不一定是一个常规数组。 – somethinghere

+1

@SomeThingHere你的猜测和我一样好。它看起来很杂乱,我所知道的是,它所做的只是任何人的猜测,它所引用的内容也是我们所拥有的未知事物。 – Blindman67

0

RuntimeArray类型显然不支持数组的所有方法,或者不正确。

因为它确实有length属性和编号的属性,你可以做肮脏的工作自己删除最后一个项目:

start_obj.length--; 
delete start_obj[start_obj.length]; 

此代码也将工作的实际阵列。减小长度也会删除最后一个项目,并且delete将无法​​完成。

相关问题