从给定数组中删除索引数组

时间:2016-02-06 20:02:05

标签: javascript arrays sorting

所以我在尝试思考在javascript中执行此操作的最佳方法时遇到了一些困难。我想从一个X元素的数组中删除一个未排序的索引数组。例如

var index = [ 0, 7, 10, 2, 5, 11] array = [{field0: 0}, {field1: 1}, {field2: 2}, ... {field5: 5}, {field6: 6}...]

所以我尝试使用带拼接的嵌套for循环,但是当我拼接时,我的数组失去了索引并搞砸了。

最终结果应该是这样的 array = [{field1: 1}, {field3: 3}, {field4: 4}, .... {field6: 6} ...]

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:2)

你的问题的解决方案实际上是一个单一的方法:

array = [00,11,22,33,44,55,66,77];
indexes = [1,7,5,3];

array = array.filter(function(_,i) { return indexes.indexOf(i) < 0 });

document.write('<pre>'+JSON.stringify(array,0,3));

答案 1 :(得分:1)

如果要排除要删除的元素数组不是问题,您可以执行以下操作:

  var array = [{field0: 0}, {field1: 1}, {field2: 2}, {field3: 3}, {field4: 4}, {field5: 5}, {field6: 6}, {field7: 7}, {field8: 8}, {field9: 9}];
  var indices = [0, 7, 2, 5];

  indices.sort(function(a, b) {
      if ( a > b ) { 
          return 1;
      } else if ( b > a ) { 
          return -1;
      } else {
          return 0;
      }
  });
  for (var i = 0, offset = 0; i < indices.length; i++, offset++) {   
      array.splice(indices[i] - offset, 1);
  }
  console.log(array);

如果由于某种原因您无法对要删除的索引数组进行排序,您可以使用以下内容跟踪偏移量:

  var array = [{field0: 0}, {field1: 1}, {field2: 2}, {field3: 3}, {field4: 4}, {field5: 5}, {field6: 6}, {field7: 7}, {field8: 8}, {field9: 9}];
  var indices = [0, 7, 2, 5];

  var removedIndices = [];
  function calcOffset(val) {
      var numRemoved = 0;
      for (var j = 0; j < removedIndices.length; j++) {
          if (val > removedIndices[j]) {
              numRemoved++;
          }
      }
      return numRemoved;
  }

  for (var i = 0, offset = 0; i < indices.length; i++, offset++) { 
      var offset = calcOffset(indices[i]);  
      array.splice(indices[i] - offset, 1);
      removedIndices.push(indices[i]);
  }

  console.log(array);

答案 2 :(得分:0)

我将遍历数组(for / next循环)并在每个元素处查看索引中是否存在数字(index.indexOf(n))。如果是,请将元素推送到新的临时数组。

完成后,将临时数组复制回数组OR array.length = 0并将临时数组中的元素推回原始数组。

类似的东西:

var index = [ 0, 7, 10, 2, 5, 11]
var array = [{field0: 0}, {field1: 1}, {field2: 2},{field3: 3}, {field4: 4}];
var tempArray = [];

for(var arrayIndex = 0;arrayIndex < array.length;arrayIndex++){
    if(index.indexOf(arrayIndex) === -1)
    {
        tempArray.push(array[arrayIndex]);
    }
}
array = tempArray;

答案 3 :(得分:0)

只要未定义不是问题,您可以尝试通过循环删除删除数组[index [count]]

或者,您可以设置循环遍历数组中的所有元素,并将索引不存在的任何元素设置为false。然后,再次循环遍历它们,只将非假的那些复制到新数组。

newArray = new Array();

for (var i = 0; i < array.length; i++) {
  for(var j=0; j<index.length; j++) {
     if (index[j] == i) {
        array[i] = false;
     }
  }
};

for (var i = 0; i < array.length; i++) {
     if (array[i] != false) {
        newArray[i] = array[i];
     }
  }