Javascript Array Concat不工作,为什么?

fcy6dtqo  于 2023-05-21  发布在  Java
关注(0)|答案(8)|浏览(296)

所以我创建了这个jqueryui小部件。它创建了一个div,我可以将错误流到其中。小部件代码如下所示:

$.widget('ui.miniErrorLog', {
   logStart: "<ul>",   // these next 4 elements are actually a bunch more complicated.
   logEnd:   "</ul>",
   errStart: "<li>",
   errEnd:   "</li>",
   content:  "",
   refs:     [],

   _create: function() { $(this.element).addClass( "ui-state-error" ).hide(); },

   clear: function() { 
      this.content = ""; 
      for ( var i in this.refs )
         $( this.refs[i] ).removeClass( "ui-state-error" );
      this.refs = [];
      $(this.element).empty().hide(); 
   }, 

   addError: function( msg, ref ) {
      this.content += this.errStart + msg + this.errEnd; 
      if ( ref ) {
         if ( ref instanceof Array )
            this.refs.concat( ref );
         else
            this.refs.push( ref );
         for ( var i in this.refs )
            $( this.refs[i] ).addClass( "ui-state-error" );
      }
      $(this.element).html( this.logStart + this.content + this.logEnd ).show();
   }, 

   hasError: function()
   {
      if ( this.refs.length )
         return true;
      return false;
   },
});

我可以在其中添加错误消息,并且对页面元素的引用将进入错误状态。我用它来验证对话框。在“addError”方法中,我可以传入一个id或一个id数组,如下所示:

$( "#registerDialogError" ).miniErrorLog( 
   'addError', 
   "Your passwords don't match.", 
   [ "#registerDialogPassword1", "#registerDialogPassword2" ] );

但是当我传入一个id数组时,它不起作用。问题出在以下几行(我认为):

if ( ref instanceof Array )
   this.refs.concat( ref );
else
   this.refs.push( ref );

为什么那个连接器不工作。这个.refs和ref都是数组。那为什么concat不起作用呢?
额外收获:我在这个小部件中还做了什么蠢事吗?这是我第一次

mrphzbgm

mrphzbgm1#

concat方法不会更改原始数组,您需要重新分配它。

if ( ref instanceof Array )
   this.refs = this.refs.concat( ref );
else
   this.refs.push( ref );
olmpazwi

olmpazwi2#

原因如下:
定义和用法
concat()方法用于连接两个或多个数组。
此方法不更改现有数组,但返回一个新数组,其中包含联接数组的值。
您需要将串联的结果赋值回您拥有的数组中。

mpbci0fu

mpbci0fu3#

关于Konstantin Dinev:
.concat()不会添加到当前对象,所以这将工作:

foo.bar.concat(otherArray);

这将:

foo.bar = foo.bar.concat(otherArray);
csbfibhn

csbfibhn4#

你必须使用=将值重新赋值给数组,你想得到关联的值

let array1=[1,2,3,4];
let array2=[5,6,7,8];

array1.concat(array2);
console.log('NOT WORK :  array1.concat(array2); =>',array1);

array1= array1.concat(array2);
console.log('WORKING :  array1 = array1.concat(array2); =>',array1);
7fyelxc5

7fyelxc55#

dataArray = dataArray.concat(array2)
cu6pst1q

cu6pst1q6#

其他人提到this.refs.concat(ref);分配并返回一个新的数组,可以重新分配给对象:this.refs = this.refs.concat(ref);. concat不修改任何一个参数数组。
然而,这里可能更准确的是使用push,它将元素添加到调用数组中:this.refs.push(ref);=没有重新分配--push返回新的数组长度,通常会被忽略)。
如果要添加多个项,push接受变量参数,因此您可以将数组扩展到它上面:

const arr = [0, 1, 2];
arr.push(3); // add one element
console.log(arr) // => [0, 1, 2, 3]
arr.push(4, 5); // add two elements
console.log(arr) // => [0, 1, 2, 3, 4, 5]
const toAdd = [6, 7, 8];
arr.push(...toAdd); // add an array
console.log(arr); // => [0, 1, 2, 3, 4, 5, 6, 7, 8]

concat可以通过重新分配创建类似的结果:

let arr = [0, 1, 2];
arr = arr.concat(3); // reassign with one new element
console.log(arr) // => [0, 1, 2, 3]
arr = arr.concat(4, 5); // reassign with two new elements
console.log(arr) // => [0, 1, 2, 3, 4, 5]
const toAdd = [6, 7, 8];
arr = arr.concat(toAdd); // reassign with a new array added
console.log(arr); // => [0, 1, 2, 3, 4, 5, 6, 7, 8]

concat显然不太适合这个用例,但对于其他用例来说很有用,特别是当需要不变性时(例如,当使用React状态时)。
使用push进行变异的另一个场合是在一个应该对其参数进行变异的函数中:

const addOne = arr => { // contrived example
  arr.push(1);
};
const arr = [];
addOne(arr);
console.log(arr); // => [1] as expected

const addOneBroken = arr => {
  arr = arr.concat(1); // purely local reassignment!
};
addOneBroken(arr);
console.log(arr); // => still [1]

合并数组和项的另一个选项是spread语法,类似于concat:

let arr = [0, 1, 2];
const toAdd = [3, 4, 5];
const arr1 = [...arr, 3]; // add one item, similar to concat
console.log(arr1); // [0, 1, 2, 3]
const arr2 = [...arr, ...toAdd]; // add an array, similar to concat
console.log(arr2); // [0, 1, 2, 3, 4, 5]
arr = [-1, ...arr, 42, ...toAdd, 6, 7]; // build a new complex array and reassign
console.log(arr); // => [-1, 0, 1, 2, 42, 3, 4, 5, 6, 7]

以上可以通过chained concat调用来完成:

let arr = [0, 1, 2];
const toAdd = [3, 4, 5];
arr = [-1].concat(arr).concat(42).concat(toAdd).concat(6).concat(7);
console.log(arr); // => [-1, 0, 1, 2, 42, 3, 4, 5, 6, 7]

请注意,如果你有一个数组,你不想在push过程中展平,只需跳过...传播:

const arr = [0, 1, 2];
const toAdd = [3, 4, 5];
arr.push(toAdd);
console.log(arr); // => [0, 1, 2, [3, 4, 5]]
mf98qq94

mf98qq947#

需要注意的是,如果你真的想在使用concat函数时有一个可变数组(我说的可变是指它不创建一个新数组,而是改变现有的数组),你可以为那个数组示例重新分配concat函数。当我需要这个的时候我就这么做了。

let myArray = [];

myArray.concat= function(  toAdd){
     if(Array.isArray(toAdd)){
        for(let node of toAdd)
             this.push(node);
      }else
        this.push(toAdd);
}
pinkon5k

pinkon5k8#

concat方法不会改变原始数组,您可以使用数组解构。

const numbers = [1,2,3,4];
const newNumbers = [5,6,7,8,9];

numbers.push(...newNumbers); // [1,2,3,4,5,6,7,8,9]

相关问题