ลบสตริงว่างออกจากอาร์เรย์ในขณะที่เก็บบันทึกโดยไม่ต้องวนซ้ำ?


91

คำถามนี้ถูกถามที่นี่: ลบสตริงว่างออกจากอาร์เรย์ในขณะที่เก็บบันทึกดัชนีด้วยสตริงที่ไม่ว่างเปล่า

หากคุณสังเกตเห็นว่า @Baz ได้ระบุไว้

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

"และจากนี้ฉันต้องการสร้างอาร์เรย์สองอาร์เรย์ต่อไปนี้:"

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

คำตอบทั้งหมดสำหรับคำถามนี้อ้างถึงรูปแบบของการวนซ้ำ

คำถามของฉัน: มีความเป็นไปได้ไหมที่จะลบindex es ทั้งหมดempty string โดยไม่ต้องวนซ้ำ ... มีทางเลือกอื่นนอกเหนือจากการวนซ้ำอาร์เรย์หรือไม่?

อาจจะเป็นบางส่วนregexหรือบางส่วนjQueryที่เราไม่ทราบ?

คำตอบหรือข้อเสนอแนะทั้งหมดได้รับการชื่นชมอย่างมาก

คำตอบ:


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

filter เอกสารประกอบ


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

เอกสารประกอบฟังก์ชันลูกศร


3
ฉันรู้ว่าคุณรู้สึกอย่างไรฉันใช้มันเมื่อหลายเดือนก่อนแก้ไขปัญหาเล็ก ๆ มากมาย
Isaac

14
คน @DiegoPlentz ที่ยังคงทำงาน IE8 จะ gonna มีปัญหามากขึ้นกว่าเพียงแค่การลบช่องว่างในอาร์เรย์ ... ฉันแทบจะไม่เคยพิจารณาสนับสนุนเบราว์เซอร์ที่วันนี้
ไอแซก

นี่คือสิ่งที่ใกล้เคียงที่สุดarray.filter(!!)ที่เราจะได้รับในขณะนี้ :)
james_womack

2
เครดิตทั้งหมดสำหรับคำตอบนี้ควรไปที่stackoverflow.com/questions/16701319/…
Isaac

คำอธิบายบางอย่างเกี่ยวกับBooleanจะดี
robsch


9

โปรดทราบ: เอกสารระบุว่า:

filterเป็นส่วนขยาย JavaScript ของมาตรฐาน ECMA-262 ดังนั้น จึงอาจไม่มีอยู่ในการใช้งานมาตรฐานอื่น ๆ คุณสามารถหลีกเลี่ยงสิ่งนี้ได้โดยการแทรกโค้ดต่อไปนี้ที่จุดเริ่มต้นของสคริปต์ของคุณอนุญาตให้ใช้ตัวกรองในการใช้งาน ECMA-262 ซึ่งไม่สนับสนุนโดยกำเนิด อัลกอริทึมนี้ตรงตามที่ระบุใน ECMA-262 รุ่นที่ 5 โดยสมมติว่า fn.call ประเมินตามค่าเดิมของ Function.prototype.call และ Array.prototype.push มีค่าดั้งเดิม

ดังนั้นเพื่อหลีกเลี่ยงความโศกเศร้าที่บางท่านอาจจะต้องเพิ่มรหัสนี้ในสคริปต์ของคุณที่จุดเริ่มต้น

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;
  };
}


2

หากใช้ jQuery grepอาจมีประโยชน์:


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

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

arr ตอนนี้ [ a, b, c, d, e, f, g];


2
jquery ดูเหมือนจะเป็นเรื่องใหญ่สำหรับงานที่ยากลำบาก
Isaac

0

กล่าวคือเราต้องใช้ที่อยู่อีเมลหลายรายการโดยคั่นด้วยลูกน้ำ, เว้นวรรคหรือขึ้นบรรทัดใหม่ตามด้านล่าง

    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(" ")"แทนที่ช่องว่างทั้งหมดด้วยค่าว่างจากนั้นลองแบ่งทุกช่องว่าง"
Isaac

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.