Xóa các chuỗi trống khỏi mảng trong khi giữ bản ghi mà không có vòng lặp?


90

Câu hỏi này đã được hỏi ở đây: Xóa các chuỗi trống khỏi mảng trong khi giữ bản ghi của các chỉ mục có chuỗi không rỗng

Nếu bạn nhận thấy điều được đưa ra như @Baz đã đặt nó ra;

"I", "am", "", "still", "here", "", "man"

"và từ đó tôi muốn tạo ra hai mảng sau:"

"I", "am", "still", "here", "man"

Tất cả các câu trả lời cho câu hỏi này đề cập đến một dạng lặp lại.

Câu hỏi của tôi: Có khả năng loại bỏ tất cả các indexes với empty string mà không có bất kỳ vòng lặp nào không? ... có cách thay thế nào khác ngoài việc lặp lại mảng không?

Có thể là một số regexhoặc một số jQuerymà chúng tôi không biết?

Tất cả các câu trả lời hoặc đề xuất được đánh giá cao.

Câu trả lời:


323
var arr = ["I", "am", "", "still", "here", "", "man"]
// arr = ["I", "am", "", "still", "here", "", "man"]
arr = arr.filter(Boolean)
// arr = ["I", "am", "still", "here", "man"]

filter tài liệu


// arr = ["I", "am", "", "still", "here", "", "man"]
arr = arr.filter(v=>v!='');
// arr = ["I", "am", "still", "here", "man"]

Tài liệu về hàm mũi tên


3
Tôi biết chính xác làm thế nào bạn cảm thấy, tôi đã sử dụng nó vài tháng trước đây, sửa rất nhiều vấn đề nhỏ
Isaac

14
@DiegoPlentz những người vẫn đang chạy IE8 sẽ gặp nhiều vấn đề hơn là chỉ xóa khoảng trống trong một mảng ... Tôi hầu như không bao giờ xem xét hỗ trợ trình duyệt đó những ngày này
Isaac

Đây là gần gũi nhất với array.filter(!!)chúng ta hiện nay có thể nhận được :)
james_womack

2
Tất cả tín dụng cho câu trả lời này sẽ được chuyển đến stackoverflow.com/questions/16701319/…
Isaac

Một số giải thích liên quan Booleansẽ là tốt đẹp.
robsch

18
var newArray = oldArray.filter(function(v){return v!==''});

Dễ dàng có câu trả lời tốt nhất. Không chính xác những gì câu hỏi yêu cầu. Không xóa giá trị 0.
Bryan

9

XIN LƯU Ý: Tài liệu cho biết:

filterlà một phần mở rộng JavaScript cho tiêu chuẩn ECMA-262; vì vậy nó có thể không có trong các triển khai khác của tiêu chuẩn . Bạn có thể giải quyết vấn đề này bằng cách chèn mã sau vào đầu tập lệnh của mình, cho phép sử dụng bộ lọc trong các triển khai ECMA-262 vốn không hỗ trợ nó. Thuật toán này chính xác là thuật toán được chỉ định trong ECMA-262, phiên bản thứ 5, giả sử rằng fn.call đánh giá giá trị ban đầu của Function.prototype.call và Array.prototype.push có giá trị ban đầu của nó.

Vì vậy, để tránh một số đau lòng, bạn có thể phải thêm mã này vào tập lệnh của mình Lúc đầu .

if (!Array.prototype.filter) {
  Array.prototype.filter = function (fn, context) {
    var i,
        value,
        result = [],
        length;
        if (!this || typeof fn !== 'function' || (fn instanceof RegExp)) {
          throw new TypeError();
        }
        length = this.length;
        for (i = 0; i < length; i++) {
          if (this.hasOwnProperty(i)) {
            value = this[i];
            if (fn.call(context, value, i, this)) {
              result.push(value);
            }
          }
        }
    return result;
  };
}

3
arr = arr.filter(v => v);

như được trả lại vlà sự không thuần túy được chuyển đổi thành sự thật


2

Nếu đang sử dụng jQuery, grep có thể hữu ích:


var arr = [ a, b, c, , e, f, , g, h ];

arr = jQuery.grep(arr, function(n){ return (n); });

arr Hiện tại là [ a, b, c, d, e, f, g];


2
jquery có vẻ như rất nhiều bulkiness cho một nhiệm vụ tầm thường
Isaac

0

tức là chúng ta cần lấy nhiều địa chỉ email cách nhau bằng dấu phẩy, dấu cách hoặc dòng mới như bên dưới.

    var emails = EmailText.replace(","," ").replace("\n"," ").replace(" ","").split(" ");
    for(var i in emails)
        emails[i] = emails[i].replace(/(\r\n|\n|\r)/gm,"");

    emails.filter(Boolean);
    console.log(emails);

.replace(" ","").split(" ")"thay thế tất cả các không gian không có gì, sau đó cố gắng chia ở mọi không gian"
Isaac

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.