如何删除数组的特定元素后的所有元素?

时间:2016-09-23 03:50:59

标签: javascript

下面是我的数组......

["AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "DDD"]

我可以做些什么来获得像[“AAA”,“BBB”,“CCC”]这样的数组

例如,如果第一个元素是“AAA”,我想在第二个“AAA”之后删除所有元素(第二个“AAA”也删除)

感谢。

6 个答案:

答案 0 :(得分:2)

您可以使用javascript中数组的 indexOf 切片方法轻松完成此操作。

var arr = ["AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "DDD"];
var firstElem = arr[0];
var secondIndex = arr.indexOf(firstElem, 1);

// Output: ["AAA", "BBB", "CCC"]
var newArr = (secondIndex != -1) ? arr.slice(0, secondIndex) : arr;

工作小提琴:https://jsfiddle.net/4f25wyaj/2/

答案 1 :(得分:0)

您可以使用Array.prototype.filter(),引用数组的第一个元素来检查值是否已被迭代



var arr = ["AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "DDD"]

var again = false;

arr = arr.filter(function(el, index) {
  return !again && (again = index > 0 && el === arr[0], !again);
});

console.log(arr);




答案 2 :(得分:0)

更快的实施(更适合短期或中型阵列):

var a = ["AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "DDD"];

// Faster implementation:
// (Better for short or medium size arrays)
var b = a.filter((function(){
    var idx = {};
    var cont = true; // Continue
    return function (item){
        if (! cont) return false;
        if (idx[item]) return cont = false;
        return idx[item] = true;
    };
})());

console.log(b);
// [ 'AAA', 'BBB', 'CCC' ]

以最少的内存浪​​费实现(但效率极低):

// Minimal memory waste implementation:
var b = a.filter((function(){
    var cont = true; // Continue
    return function (item, i){
        if (! cont) return false;
        if (a.slice(0, i).filter(x=>x==item).length) return cont = false;
        return true;
    };  
})());

console.log(b);
// [ 'AAA', 'BBB', 'CCC' ]

当然,有无限的中间方法(取决于你的需要)。但是,如果您不需要解析 HUGE 数组,最好的解决方案是使用第一种方法:一旦过滤器处理完成,Index将被垃圾收集器释放,事实上,如果你很幸运,重复发生得很早,然后就没有多少记忆; - )

答案 3 :(得分:0)

使用jQuery each()函数快速而又脏。

each()遍历数组并将元素添加到新数组,直到找到第一个元素的副本。

var arr = ["AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "DDD"];
var newArray = [];
$.each(arr, function(i, el){
    if($.inArray(el, newArray) === -1) 
      newArray.push(el);
    else if (el == arr[0])
      return false
});
arr = newArray;
// Formatted array is in "arr"
alert(arr);

答案 4 :(得分:-1)

虽然你的问题并不完全清楚 但仍然按照我的理解,我提供以下解决方案

Solution 1:
 Assumption: You have a list of input and a pointer which shows the last index till you want to pick the input data.

    public static void main(String[] args) {
        String input[] = { "AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "DDD" };
        String output[]= new String[5];
        int stopByIndex =3;

        for(int i=0;i<stopByIndex;i++){
            output[i]=input[i];
        }
        System.out.println(output);
    }


 Solution 2:
Assumption: Print elements which occurred multiple times:

  public static void main(String[] args) {
    String input[] = { "AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "DDD" };
    List<String> output = new ArrayList<>();
    Map<String, Integer> keyWithCount = new HashMap<String, Integer>();
    int stopByIndex = 3;

    for (String str : input) {
        if (keyWithCount.containsKey(str)) {
            keyWithCount.put(str, keyWithCount.get(str) + 1);
        } else {
            keyWithCount.put(str, 1);
        }
    }

    Iterator<Entry<String, Integer>> itr = keyWithCount.entrySet().iterator();
    while (itr.hasNext()) {
        Entry<String, Integer> entry = itr.next();

        if (entry.getValue() > 1) {
            output.add(entry.getKey());
        }
    }

    System.out.println(output);
}

答案 5 :(得分:-1)

试试这个:

var arr = ["AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "AAA", "BBB", "CCC",     "DDD"];

arr.splice(3)