javascript .pop()方法导致范围错误

时间:2015-11-02 16:09:58

标签: javascript

我正在为每个公式创建一个Object。公式[0] = start_obj是unixtimestamps,公式1也是unixtimestamps。在某些情况下,我需要切断阵列中的最后一个印章。我尝试使用popind()和splice()方法。两者都进入rangeError。

这是我的代码:

    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?
}

来自控制台的数组如下所示:

>> 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:

它是一个Runtime数组,从控制台看屏幕。 Screenshot

EDIT_2:

再次感谢大家,你真棒。我发现这绝对不是一个普通的阵列。我写了一个函数,将这个凌乱的数组(或者这是什么)转换成常规数组。这是商业软件,我没有直接访问wedge.what.ever()正在做的这些“后台功能”。 无论如何,谢谢你们所有人在这里进行闪电般的讨论。

这是转换函数:

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)

将其转换为常规数组!感谢大家的大声思考。

3 个答案:

答案 0 :(得分: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,这将是未定义的pop。为了更好地帮助您,我们需要知道您是否在this上下文中运行。如果没有,最好使用window声明,或者,根本不是这样。如果您使用this来声明它,那么 还需要this来阅读它。因此,使用this.start_obj可能会有效。

答案 1 :(得分:2)

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

您正在调用的pop不是本机Array pop。您必须提供该功能的代码才能为我们提供帮助。此外,由于它不是原生的,您应该能够使用调试器进入它并找到问题的根源。

答案 2 :(得分:0)

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

由于它具有length属性和编号属性,您可以自己执行脏工作以删除最后一项:

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

此代码也适用于实际数组。减少长度也将删除最后一项,而delete将无法完成任务。