【问题标题】:Alternate method to splice function in JavaScriptJavaScript 中拼接函数的替代方法
【发布时间】:2011-09-24 19:34:31
【问题描述】:

您好,我正在研究 LIME 编程,它是 javascript 的一个子集。

我需要使用 javascript.splice 从我的数组中删除某些元素,遗憾的是,LIME 不支持拼接功能。

知道如何创建自己的函数来从数组中删除元素吗?

感谢您的宝贵时间。

编辑:设法创建一个简单的函数。

function removeElements(array, index)
{
    var tempArray = new Array();
    var counter = 0;

    for(var i = 0; i < array.length; i++)
    {
        if(i != index)
        {
            tempArray[counter] = array[i];
            counter++;
        }
    }
    return tempArray;
}

【问题讨论】:

  • 轻量级交互式多媒体环境。

标签: javascript lime


【解决方案1】:

我做了非常相似的方式,只使用了一个 for 循环

function removeElements(a,index,n){
  // a=> Array , index=> index value from array to delete
 // n=> number of elements you want to delete
   let temp = []; // for storing deleted elements
   let main_array = []; // for remaining elements which are not deleted
   let k = 0;
   for(let i=0;i<a.length;i++){
      if((i===index) || ((index<i && i<n+index))){
      temp[i]=a[i+1];
      delete a[i];
       }
    if(a[i]!==undefined){
      main_array[k] = a[i]; 
      a[i] = main_array[k];
       k++;
       }
     }

      a=main_array;
   return a;
   }
  a=[1,2,3,4,5];
  console.log(removeElements(a,0,1));

关注链接Jsfiddle

【讨论】:

    【解决方案2】:

    如果您不关心数组的顺序,而只是寻找执行拼接的函数,这里有一个示例。

    /**
     * Time Complexity: O(count) aka: O(1)
     */
    function mySplice(array, start, count) {
      if (typeof count == 'undefined') count = 1
    
      while (count--) {
        var index2remove = start + count
        array[index2remove] = array.pop()
      }
    
      return array
    }
    

    如果您想像普通拼接方法一样返回已删除的元素,这将起作用:

    /**
     * Time Complexity: O(count) aka: O(1)
     */
    function mySplice(array, index, count) {
      if (typeof count == 'undefined') count = 1
    
      var removed = []
    
      while (count--) {
        var index2remove = index + count
        removed.push(array[index2remove])
        array[index2remove] = array.pop()
      }
      // for (var i = index; i < index + count; i++) {
      //    removed.push(array[i])
      //    array[i] = array.pop()
      // }
    
      return removed
    }
    

    【讨论】:

      【解决方案3】:

      我在function 下方使用它作为splice() 的替代品

      array = mySplice(array,index,count);
      

      上面是函数调用, 这是我的功能mySplice()

       function mySplice(array, index, count)
      {    
          var newArray = [];
          if( count > 0 ) 
              { count--;}
          else
              { count++;}
          for(i = 0; i <array.length; i++)
              {
                  if(!((i <= index + count && i >=  index) || (i <= index && i >=  index + count)))  
                  {
                     newArray.push(array[i])
                  }            
              }      
          return newArray;
      }
      

      【讨论】:

        【解决方案4】:

        Array.prototype.splice 在 ECMA-262 §15.4.4.12 中完全定义,因此将其用作您的规范并编写一个。例如

        15.4.4.12 Array.prototype.splice (start, deleteCount [ , item1 [ ,item2 [ , ... ] ] ] )

        当拼接 方法被两个或多个调用 参数 startdeleteCount 和 (可选)item1item2 等, deleteCount 个数组元素 从数组索引 start 开始是 替换为参数item1item2 等 一个 Array 对象包含 被删除的元素(如果有的话)是 回来。以下步骤是 采取:...

        您可能需要创建一个新数组,将成员从旧数组复制到 start,插入新成员,然后从 start + deleteCount 到新数组的末尾。

        编辑

        这里是修改后的拼接,我发的第一个是不正确的。这个拼接传入的数组并返回删除的成员。它看起来有点长,但我试图让它接近规范,并且不假设支持任何复杂的 Array 方法甚至 Math.max/min。如果是的话,可以简化很多。

        如果不支持推送,也可以相当简单地替换它。

        function arraySplice(array, start, deleteCount) {
          var result = [];
          var removed = [];
          var argsLen = arguments.length;
          var arrLen = array.length;
          var i, k;
        
          // Follow spec more or less
          start = parseInt(start, 10);
          deleteCount = parseInt(deleteCount, 10);
        
          // Deal with negative start per spec
          // Don't assume support for Math.min/max
          if (start < 0) {
            start = arrLen + start;
            start = (start > 0)? start : 0;
          } else {
            start = (start < arrLen)? start : arrLen;
          }
        
          // Deal with deleteCount per spec
          if (deleteCount < 0) deleteCount = 0;
        
          if (deleteCount > (arrLen - start)) {
            deleteCount = arrLen - start;
          }
        
          // Copy members up to start
          for (i = 0; i < start; i++) {
            result[i] = array[i];
          }
        
          // Add new elements supplied as args
          for (i = 3; i < argsLen; i++) {
            result.push(arguments[i]);
          }
        
          // Copy removed items to removed array
          for (i = start; i < start + deleteCount; i++) {
            removed.push(array[i]);
          }
        
          // Add those after start + deleteCount
          for (i = start + (deleteCount || 0); i < arrLen; i++) {
            result.push(array[i]);
          }
        
          // Update original array
          array.length = 0;
          i = result.length;
          while (i--) {
            array[i] = result[i];
          }
        
          // Return array of removed elements
          return removed;
        }
        

        【讨论】:

        • 嗨,谢谢,我能够使用它来解决编码挑战,现在正在审查它以更好地了解发生了什么
        【解决方案5】:

        这是一个简单的实现,以防 Array.prototype.splice 消失

        if (typeof Array.prototype.splice === 'undefined') {
            Array.prototype.splice = function (index, howmany, elemes) {
                howmany = typeof howmany === 'undefined' || this.length;
                var elems = Array.prototype.slice.call(arguments, 2), newArr = this.slice(0, index), last = this.slice(index + howmany);
                newArr =  newArr.concat.apply(newArr, elems);
                newArr =  newArr.concat.apply(newArr, last);
                return newArr;
            }
        }
        

        【讨论】:

          【解决方案6】:

          这会修改原始数组,并返回被删除的项目,就像原始的一样。

          Array.prototype.newSplice = function( start, toRemove, insert ) {
              var remove = this.slice( start, start + toRemove );
              var temp = this.slice(0,start).concat( insert, this.slice( start + toRemove ) );
              this.length = 0;
              this.push.apply( this, temp );
              return remove;
          };
          

          对比测试:http://jsfiddle.net/wxGDd/

          var arr = [0,1,2,3,4,5,6,7,8];
          var arr2 = [0,1,2,3,4,5,6,7,8];
          
          
          console.log( arr.splice( 3, 2, 6 ) );      // [3, 4]
          console.log( arr );      // [0, 1, 2, 6, 5, 6, 7, 8]
          
          console.log( arr2.newSplice( 3, 2, 6 ) );  // [3, 4]
          console.log( arr2 );     // [0, 1, 2, 6, 5, 6, 7, 8]
          

          它可以使用一些额外的细节工作,但在大多数情况下它会处理它。

          【讨论】:

          • 很好,但如果 splice 不支持,那么其他方法可能也不支持。可能还值得指出向内置原型添加属性的问题(for..in 中的额外枚举属性)。此外,它是否处理负 startdeleteCount 参数?
          • @RobG:是的,你是对的,它不涉及一些细节(这是我提到的额外细节工作)。关于其他方法,我只是不知道,所以很可能它们不可用。对于for-in 问题,是的,我可能应该提到它,但无论如何我们不应该for-in 一个数组。 ;o)
          【解决方案7】:

          LIME 的 Array 实现中是否缺少其他方法?

          假设至少有最基本的push()indexOf() 可用,有几种方法可以做到。如何做到这一点取决于这是破坏性方法还是应该返回一个新数组。假设输入与标准splice(index, howMany, element1, elementN) 方法相同:

          1. 创建一个名为new的新数组
          2. push() 将 0 到 index 索引到 new 数组中
          3. 现在在indexpush() 处停止传入任何新元素。如果LIME 支持标准arguments 变量,那么您可以循环通过索引> 2 的arguments。否则您需要传入一个数组而不是可变数量的参数。
          4. 插入新对象后,继续循环输入数组的元素,从index + howMany 开始直到input.length

          我相信这应该会为您带来您正在寻找的结果。

          【讨论】:

            猜你喜欢
            • 2012-10-18
            • 2021-03-19
            • 1970-01-01
            • 2019-11-11
            • 1970-01-01
            • 2015-10-24
            • 2021-08-04
            • 1970-01-01
            • 2019-01-03
            相关资源
            最近更新 更多