Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript代理:修改数组目标并更新数组(长度、内容)_Javascript_Arrays_Proxy - Fatal编程技术网

Javascript代理:修改数组目标并更新数组(长度、内容)

Javascript代理:修改数组目标并更新数组(长度、内容),javascript,arrays,proxy,Javascript,Arrays,Proxy,我正在代理一个数组,并根据某些条件修改该数组以保持数据完整性,但当从代理修改该数组时,该数组不会放置得很好 我遇到的问题是代理数组被***未定义***污染 如果目标对象被修改,如何更新它使其正确 下面是一个示例笔:(如果您查看控制台,空值实际上是未定义的值) 使用Chrome 51.0.2704.103版(64位) var test=新代理([]{ 设置:功能(目标、名称、值、接收者){ 如果(名称!=“长度”){ console.log(名称、目标) //我想覆盖值 var i=target.

我正在代理一个数组,并根据某些条件修改该数组以保持数据完整性,但当从代理修改该数组时,该数组不会放置得很好

我遇到的问题是代理数组被***未定义***污染

如果目标对象被修改,如何更新它使其正确

下面是一个示例笔:(如果您查看控制台,空值实际上是未定义的值)

使用Chrome 51.0.2704.103版(64位)

var test=新代理([]{
设置:功能(目标、名称、值、接收者){
如果(名称!=“长度”){
console.log(名称、目标)
//我想覆盖值
var i=target.indexOf(值)
如果(i>-1){
//不起作用
拼接(parseInt(name,10),1);
//不起作用
删除目标[名称];
目标[i]=价值;
}否则{
目标[名称]=值;
}
}否则{
目标[名称]=值;
}
控制台日志(目标);
返回true;
}
});
函数日志(){
$('.log').append('
'+JSON.stringify(test)+test.length); } log(); 测试。推('what','hi','yo'); log(); test.push('what','yo'); log(); 测试拼接(0,测试长度) log();
此处提交的bug

您的问题来自于这样一个事实,即单独设置length属性(),并且set函数将对length属性的赋值处理为普通赋值

一种可能的解决方案是,仅当赋值不超过最后一个元素时,才允许指定长度:

var test = new Proxy([], {
  set: function(target, name, value, receiver) {
    if(name != 'length'){

      // I want to overwrite values
      if((i = target.indexOf(value)) > -1){
        target[i] = value;
      }else{
        target[name] = value;
      }
    }else{
      if ( value <= Math.max( -1, ... Object.keys( target ) ) + 1 )
        target.length = value;
      numSkipped = 0;
    }

    return true;
  }
});
var test=新代理([]{
设置:功能(目标、名称、值、接收者){
如果(名称!=“长度”){
//我想覆盖值
如果((i=target.indexOf(value))>-1){
目标[i]=价值;
}否则{
目标[名称]=值;
}
}否则{

如果(value您的问题来自于单独设置length属性(),并且set函数将length属性的赋值处理为普通赋值

一种可能的解决方案是,仅当赋值不超过最后一个元素时,才允许指定长度:

var test = new Proxy([], {
  set: function(target, name, value, receiver) {
    if(name != 'length'){

      // I want to overwrite values
      if((i = target.indexOf(value)) > -1){
        target[i] = value;
      }else{
        target[name] = value;
      }
    }else{
      if ( value <= Math.max( -1, ... Object.keys( target ) ) + 1 )
        target.length = value;
      numSkipped = 0;
    }

    return true;
  }
});
var test=新代理([]{
设置:功能(目标、名称、值、接收者){
如果(名称!=“长度”){
//我想覆盖值
如果((i=target.indexOf(value))>-1){
目标[i]=价值;
}否则{
目标[名称]=值;
}
}否则{


如果(值不清楚您想要实现什么。您说要覆盖注释中的值,但仅当该值在数组中时,您才想用相同的值覆盖它?这不会使数组保持不变吗?看起来您正在尝试实现自己的或其他内容,但不太清楚。您想要什么输出是否类似?@Paulpro显然,这只是一个示例,用于演示数组添加“未定义”值。在实践中,想法是通过ID合并传入的数据(如果存在)。讨论这一点没有意义,因为此示例演示了“不变”数组如何仍然添加“未定义”这个问题的目的是问“为什么有未定义的值”或者更好的是“如何阻止它发生”。要回答你的问题,最后的数组应该是['what'、'hi'、'yo'],而不是['what'、'hi'、'yo',未定义,未定义]。我认为这与目标上的内部“length”属性无关。在另一个测试中,我尝试修改了该属性。在您尝试执行拼接或其他绕过“set proxy”的数组函数之前,该属性一直有效。我明白了,我只是被相同值的覆盖弄糊涂了。我有一个答案。不清楚您到底想实现什么。您说您想覆盖注释中的值,但前提是该值位于数组中,您想用相同的值覆盖该值?这不会使数组保持不变吗?似乎您正在尝试实现自己的值或其他内容,但不太清楚。您想要输出什么看起来像?@Paulpro显然,这只是一个示例,用于演示数组添加“未定义”值。在实践中,想法是通过ID合并传入的数据(如果存在)。讨论这一点毫无意义,因为此示例演示了“不变”数组如何仍然添加“未定义”这个问题的目的是问“为什么有未定义的值”或者更好的是“如何阻止它发生”。要回答你的问题,最后的数组应该是['what'、'hi'、'yo'],而不是['what'、'hi'、'yo',未定义,未定义]。我认为这与目标上的内部“length”属性无关。在另一个测试中,我尝试修改了该属性。在您尝试执行拼接或其他绕过“set proxy”的数组函数之前,该属性一直有效。我明白了,我只是被相同值的覆盖弄糊涂了。我有一个答案。啊!这确实有效……请看这支笔:使用splice将未定义的值保留在那里……:headscratch:请解释您的代码的功能。这被认为是一种良好的做法。@VaibhavBajaj解释代码是一种良好的做法。但正如他所说,他不确定它为什么有效。他说的是不进行长度分配和只需返回true。啊!这确实有效……请看这支笔:使用splice将未定义的值保留在那里……:headscratch:请解释您的代码的功能。这被认为是一种良好的做法。@VaibhavBajaj解释代码是一种良好的做法。但正如他所说,他不确定它为什么有效。他说的是不要执行length赋值并返回true。嗨,Paul,我确实尝试在代码库中执行类似的操作,正如您所指出的那样,但是,如果您拼接数组(移除的项目数未知),我们就有麻烦了
var test = new Proxy([], {
  set: function(target, name, value, receiver) {
    if(name != 'length'){

      // I want to overwrite values
      if((i = target.indexOf(value)) > -1){
        target[i] = value;
      }else{
        target[name] = value;
      }
    }else{
      if ( value <= Math.max( -1, ... Object.keys( target ) ) + 1 )
        target.length = value;
      numSkipped = 0;
    }

    return true;
  }
});