Làm thế nào để xác định một mảng với các phần tử điều kiện?


99

làm cách nào để xác định các phần tử mảng có điều kiện? tôi muốn làm một cái gì đó như thế này:

const cond = true;
const myArr = ["foo", cond && "bar"];

điều này hoạt động như mong đợi: ["foo", "bar"]

Nhưng nếu tôi đặt condthànhfalse , tôi nhận được kết quả sau:["foo", false]

Làm cách nào để xác định một mảng có phần tử điều kiện?


Câu trả lời:


231

Bạn có thể dàn trải một mảng bên trong một mảng, để giữ cho mảng các mục sạch, khi điều kiện là false.

Đây là cách bạn có thể làm điều đó :

// Will result in ['foo', 'bar']
const items = [
  'foo',
  ... true ? ['bar'] : [],
  ... false ? ['falsy'] : [],
]

console.log(items)

Giải thích :

Như bạn có thể thấy, toán tử bậc ba luôn trả về một mảng.

Nếu điều kiện là true, thì nó trả về ['bar'], ngược lại là một mảng trống [].

Sau đó, chúng tôi trải ra ...mảng kết quả (từ phép toán bậc ba) và các mục của mảng được đẩy lên mảng mẹ.

Nếu không có bất kỳ mục mảng nào (khi kiểm tra bậc ba false), thì không có gì sẽ được đẩy, đó là mục tiêu của chúng tôi.


Trong câu trả lời khác, tôi giải thích ý tưởng tương tự, nhưng đối với các đối tượng. Bạn cũng có thể kiểm tra nó ở đây .


1
Gần đây tôi cần phải làm điều này và sử dụng spread dường như là giải pháp rõ ràng nhất đối với tôi. Rất vui vì những người khác cũng đang sử dụng mẫu này. Tôi không muốn làm cho nó quá khó hiểu nhưng tôi sẽ chạy với nó vì nó có vẻ đủ phổ biến.
Brennan Cheung

cảm ơn rất nhiều ~ !! tôi chỉ cần thậm chí không xem xét sự lây lan như một tùy chọn
carinlynchin

Điều này rất tuyệt, không nghĩ rằng sẽ có cách làm điều này mà không cần lọc mảng sau thực tế
JDune

1
Chết tiệt rằng lý do tại sao tôi yêu ECMAScript
anni

1
Giải pháp tuyệt vời!
bắt 22

22

Tôi sẽ làm điều này

[
  true && 'one',
  false && 'two',
  1 === 1 && 'three',
  1 + 1 === 9 && 'four'
].filter(Boolean) // ['one', 'three']

Lưu ý rằng điều này cũng sẽ loại bỏ falsy giá trị, chẳng hạn như chuỗi rỗng.


1
Tôi thích ý tưởng. Nhưng cách triển khai của bạn sẽ sai đối với [true && '']. Chuỗi trống sẽ được lọc ra. Tôi muốn sử dụng một hàm trợ giúp như [foo] .filter (isNonBoolean) hoặc [foo] .stripBoolean ()
Martin

@Martin Vâng, có lẽ điều đó có thể được giải thích trong câu trả lời. Tôi sẽ tiếp tục và chỉnh sửa nó!
Michael Bergquist Suarez

Tôi nghĩ sẽ có vấn đề nếu tôi cần một mảng như thế này: const arr = ['one', 'two', false, true]; Nhưng ý tưởng là tốt cho giá trị trung thực :)
Sanjib Debnath


8

Nếu bạn thực sự muốn giữ nó như một lớp lót, bạn có thể sử dụng:

const cond = true;
const myArr = ["foo"].concat(cond ? ["bar"] : []);

thông minh, rất hữu ích cho tôi đối với mảng có điều kiện, tức làconst myArr = (cond ? ['item 1'] : []).concat(['item 2', 'item 3']);
devonj

6

Bạn không có quá nhiều tùy chọn ngoài việc sử dụng push:

const cond = true;
const myArr = ["foo"];

if (cond) myArr.push("bar");

Một ý tưởng khác có khả năng thêm null và lọc chúng ra:

const cond = true;
const myArr = ["foo", cond ? "bar" : null];

myArr = myArr.filter((item) => item !== null);

2

Có một số cách khác nhau, nhưng cách bạn đang làm sẽ không thực sự hiệu quả với Javascript.

Giải pháp đơn giản nhất là chỉ có câu lệnh if.

if (myCond) arr.push(element);

Cũng có filter, nhưng tôi không nghĩ đó là những gì bạn muốn ở đây, vì bạn dường như sẽ "Thêm điều này, nếu một điều kiện này là đúng" hơn là kiểm tra mọi thứ theo một số điều kiện. Mặc dù, nếu bạn muốn thực sự kỳ quặc, bạn có thể làm điều này (sẽ không được khuyến khích, nhưng bạn có thể làm được thì thật tuyệt).

var arr = ["a", cond && "bar"];
arr.filter( e => e)

Về cơ bản, nó sẽ chỉ lọc ra tất cả các giá trị không đúng.


1
điều này có vẻ tuyệt. bạn cũng có thể làm var arr = ["a", cond && "bar"].filter(e => e);@Adam LeBlanc nhưng bạn nói đúng, nó có thể là rác. nhưng rác mát;)
Manu Schiller

Thật tuyệt, nhưng tôi khuyên bạn không nên dùng nó chỉ vì một giá trị có điều kiện. Nó phù hợp hơn cho mục đích chung là "Loại bỏ tất cả các giá trị sai". Vì bạn sẽ chỉ xem qua toàn bộ mảng chỉ cho một giá trị. Nhưng nếu bạn có một lượng giá trị điều kiện không xác định, thì đó có lẽ là một giải pháp tốt.
Adam LeBlanc

.filter (e => e) sẽ lọc ra chuỗi trống.
Martin

2
const cond = false;
const myArr = ["foo", cond ? "bar" : null].filter(Boolean);

console.log(myArr)

Sẽ dẫn đến ["foo"]


0

Phương pháp thay thế: Lọc trước điền thay vì lọc bài:

const populate = function(...values) {
    return values.filter(function(el) {
        return el !== false
    });
};

console.log(populate("foo", true && "bar", false && "baz"))

Lợi nhuận

(2) ["foo", "bar"]

Tôi biết rằng điều đó không giải quyết được ký hiệu viết tắt (vì nó sẽ không hoạt động cho dù bạn cố gắng gì) nhưng nó gần đạt được điều đó.


0

nếu bạn đang sử dụng es6, tôi sẽ đề nghị

let array = [ "bike", "car", name === "van" ? "van" : null, "bus", "truck", ].filter(Boolean);

Mảng này sẽ chỉ chứa giá trị "van" nếu tên bằng "van", nếu không, nó sẽ bị loại bỏ.


-1

nếu bạn dùng Array.push

Bạn có thể làm theo

var a = ["1"]
a.push(... !true ? ["2"] : [])

Kết quả là ["1"]

hoặc là

var a = ["1"]
a.push(... true ? ["2"] : [])

Kết quả là ["1","2"]


Nếu bạn định sử dụng a checkpushgiải pháp của bạn chắc chắn không phải là giải pháp có độ rõ ràng cao nhất. Tôi sẽ gắn bó với if (check) foo.push( item );thay vì dàn trải một mảng trống trong trường hợp giả mạo.
Martin
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.