javascript .pop()方法导致范围错误
我正在为每个公式创建一个对象。公式[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)
其转换成规则排列!感谢大家的大声思考。
当我运行下面的代码(从你的例子简体),它的工作原理:
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
将工作。
嗷嗷,我一直使用safari作为一个空的小提琴与控制台日志document.write总是看起来如此......未完成。很高兴知道! – somethinghere
(oops,我不小心删除了我的评论,之前阅读过它)document.write可能无法在沙盒环境中工作,如小提琴。 –
在循环中创建'start_obj'和'stop_obj'变量。 – Guffa
ES6文档显示pop不会生成Range错误。 ECMA Array.pop
您调用的弹出不是本地数组弹出。您将不得不为该功能提供代码,以便我们提供帮助。同样,因为它不是原生的,你应该能够用调试器进入它并找出问题的根源。
它来自这一行,右:'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
@SomeThingHere你的猜测和我一样好。它看起来很杂乱,我所知道的是,它所做的只是任何人的猜测,它所引用的内容也是我们所拥有的未知事物。 – Blindman67
RuntimeArray
类型显然不支持数组的所有方法,或者不正确。
因为它确实有length
属性和编号的属性,你可以做肮脏的工作自己删除最后一个项目:
start_obj.length--;
delete start_obj[start_obj.length];
此代码也将工作的实际阵列。减小长度也会删除最后一个项目,并且delete
将无法完成。
您的start_obj变量在哪里定义?它是否存在于formel_obj对象上?您可能试图从未初始化的数组中弹出。 –
'wedge.calc.eval_with_timeaxis(...)[0]'返回什么样的数据?你创建一个数组,然后用这个值替换它。如果这实际上不是数组,则不能将其用作数组。 – Guffa
@CameronTinker:'start_obj'变量在循环中创建:'this [label] = ...'其中'label ==“start_obj”'。 – Guffa