2010-03-03 34 views
5

Xin lỗi cho câu hỏi đơn giản này nhưng tôi vẫn còn tương đối mới đối với javascript.Chuyển đổi mảng thành văn bản được phân cách bằng dấu phẩy

tôi có một loạt các tên, một cái gì đó giống như

var myArray = ['Hill M','Zhang F','Dong L', 'Wilkinson JS', 'Harris N']; 

Tôi muốn trả về một chuỗi, với những cái tên cách nhau bởi dấu phẩy, nhưng bằng "và" giữa hai tên cuối cùng, tức là

'Hill M, Zhang F, Dong L, Wilkinson JS and Harris N' 

Cách hiệu quả nhất để làm điều này trong javascript là gì?

Làm thế nào về nếu tôi muốn transpose tên và chữ viết tắt, ví dụ: để trở

'M Hill, F Zhang, L Dong, JS Wilkinson and N Harris' 

Trả lời

19

Array::slice() Chọn một phần của mảng và trả về mảng mới.
Array::join() Tham gia tất cả các thành phần của một mảng thành một chuỗi
String::concat() Nối hai hoặc nhiều chuỗi.

var myArray = ['Hill M','Zhang F','Dong L', 'Wilkinson JS', 'Harris N']; 

console.log(myArray.slice(0, myArray.length - 1).join(', ').concat(
      ' and ' + myArray[myArray.length - 1])); 

//Hill M, Zhang F, Dong L, Wilkinson JS and Harris N 

Để thay đổi thứ tự của chúng:

var myArray = ['Hill M','Zhang F','Dong L', 'Wilkinson JS', 'Harris N']; 

for(var i = 0; i < myArray.length; i++) 
    myArray[i] = myArray[i].replace(/^(\S+)\s+(.+)$/, '$2 $1'); 

console.log(myArray.slice(0, myArray.length - 1).join(', ').concat(
      ' and ' + myArray[myArray.length - 1])); 

//M Hill, F Zhang, L Dong, JS Wilkinson and N Harris 

Trong trường hợp bạn đang tự hỏi về str.replace(/^(\S+)\s+(.+)$/, '$2 $1');

/^(\S+)\s+(.+)$/ là biểu thức chính quy phù hợp với một chuỗi:

^ #starts with 
\S+ #one or more non whitespace characters, followed by 
\s+ #one or more whitespace characters, followed by 
.+ #one or more characters 

$1$2 trong t ông thay thế chuỗi là viết tắt của nhóm 1 và 2 (subpatterns kèm theo trong ngoặc) từ regex.

+1

Đó là tốt, nhưng đưa ra một số lời giải thích, có lẽ? OP cho biết anh ta mới đến js. –

+0

Điều đó hoạt động rực rỡ - cảm ơn rất nhiều. Chỉ có vấn đề nhỏ là phần thứ hai (đảo ngược/chuyển vị trí) không thành công cho những cái tên như "Ben Gaied N", nhưng tôi đã không hỏi một cách rõ ràng về điều đó, và tôi chắc chắn rằng tôi có thể phân loại nó ra. – Tomba

+1

@Tomba regex hiện đang hoán đổi các từ ở khoảng trắng đầu tiên. Sử dụng '/ (. +) \ S + (\ S +) /' để hoán đổi ở khoảng trống cuối cùng. – Amarghosh

8

Sử dụng join để kết hợp các giá trị trong mảng.

var myJoinedString = myArray.join(','); 
2
var myArray = ['Hill M','Zhang F','Dong L', 'Wilkinson JS', 'Harris N']; 
var replaced = myArray.map(function(elem) { 
    return elem.replace(/(\S+)\s+(\S+)/, "$2 $1"); 
}); 
var last = replaced.pop() 
var result = replaced.join(", ") + " and " + last; 

alert(result) 
+0

Tốt, nhưng bạn có thể muốn sử dụng '/^(.*?)\s+(\S+)$'/ cho biểu thức của mình để thay thế –

2

Hãy thử điều này:

if (myArray.length <= 1) { 
    str = myArray.join(); 
} else { 
    str = myArray.slice(0, -1).join(", ") + " and " + myArray[myArray.length-1]; 
} 

Và đối với phần trao đổi của bạn:

myArray.map(function(val) { return val.split(" ").reverse().join(" "); }) 
Các vấn đề liên quan