2017-07-04 19 views
5

làm cách nào tôi có thể 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:Làm thế nào để xác định một mảng với các yếu tố có điều kiện?

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

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

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

Làm sao tôi xác định một mảng với một yếu tố có điều kiện?

+0

thử với if (cond) {myArr.push ("bar")} –

+0

bạn sẽ cần phải sử dụng chức năng đẩy hoặc loại bỏ tất cả các mục null sau đó 'cond? "bar": null'. – NtFreX

+1

Bất kể bạn làm gì với cú pháp này, nó sẽ quảng cáo ít nhất là thêm một 'undefined'. – Jankapunkt

Trả lời

7

Bạn có thể lan truyền một mảng bên trong một mảng, để giữ mục mảng sạch, khi điều kiện là false:

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

 
console.log(items)

1

Bạn có thể thử với một đơn giản nếu:

if(cond) { 
    myArr.push("bar"); 
} 
1

Bạn không có quá nhiều lựa chọn khác là sử dụng push:

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

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

ý tưởng khác là khả năng thêm rỗng và lọc chúng ra:

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

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

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"] : []); 
1

Có một vài 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ần có câu lệnh if.

if (myCond) arr.push(element); 

Ngoài ra còn có filter, nhưng tôi không nghĩ rằng đó là những gì bạn muốn ở đây chút nào, vì bạn dường như được đi cho "Thêm một điều này, nếu một điều kiện này là đúng" chứ không phải là kiểm tra tất cả mọi thứ chống lại một số điều kiện. Mặc dù, nếu bạn muốn có được thực sự freaky, bạn có thể làm điều này (sẽ không khuyên bạn nên, nhưng nó là mát mẻ mà bạn có thể).

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

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

+0

điều này có vẻ thú vị. 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ó lẽ là rác. nhưng rác mát mẻ;) –

+0

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

1

phương pháp thay thế: Pre-Filter cư thay vì bài lọc:

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

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

Returns

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

Tôi biết rằng không giải quyết các ký hiệu viết tắt (vì nó sẽ không làm việc không có vấn đề gì bạn thử) nhưng nó đến gần đó.

0

Tôi muốn làm điều này

[ 
    true && 'one', 
    false && 'two', 
    1 === 1 && 'three', 
    1 + 1 === 9 && 'four' 
].filter(Boolean) // ['one', 'three'] 
Các vấn đề liên quan