JavaScript 中拼接函数的替代方法

Posted

技术标签:

【中文标题】JavaScript 中拼接函数的替代方法【英文标题】:Alternate method to splice function in JavaScript 【发布时间】: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;

【问题讨论】:

轻量级交互式多媒体环境。 【参考方案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) 方法相同:

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

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

【讨论】:

以上是关于JavaScript 中拼接函数的替代方法的主要内容,如果未能解决你的问题,请参考以下文章

javascript中字符串和数字怎么拼接

如何在Javascript中链接两个拼接方法?

javascript 中拼接字符串,如何把一段代码拼接起来

JavaScript字符串Format

java中怎么用jsp调用已有的接口,加密拼接参数

java8新特性→方法和构造函数引用:替代Lambda表达式