Làm cách nào để đặt biến trong chuỗi javascript? (Node.js)


146
s = 'hello %s, how are you doing' % (my_name)

Đó là cách bạn làm điều đó trong python. Làm thế nào bạn có thể làm điều đó trong javascript / node.js?


1
Tôi chắc chắn có một người rơm tiếp theo ở đâu đó để làmvar s = 'hello ${my_name}, how are you doing';
Raynos

1
Tôi dùng như Raynos đã nói: const poem = "Dòng sông đen"; const tác giả = "Joseph Troll"; const favePoem = `Bài thơ yêu thích của tôi là $ {poem} của $ {tác giả} \.`; Hoặc bạn có thể sử dụng: console.log ('% s là% d.', 'Eleven', 11);
Gilberto B. Terra Jr.

Câu trả lời:


56

Nếu bạn muốn có một cái gì đó tương tự, bạn có thể tạo một hàm:

function parse(str) {
    var args = [].slice.call(arguments, 1),
        i = 0;

    return str.replace(/%s/g, () => args[i++]);
}

Sử dụng:

s = parse('hello %s, how are you doing', my_name);

Đây chỉ là một ví dụ đơn giản và không tính đến các loại dữ liệu khác nhau (như %i, v.v.) hoặc thoát %s. Nhưng tôi hy vọng nó cung cấp cho bạn một số ý tưởng. Tôi khá chắc chắn rằng cũng có những thư viện ngoài đó cung cấp một chức năng như thế này.


1
Về cơ bản, đó là thứ tốt nhất bạn sẽ nhận được vì nó không được hỗ trợ trực tiếp bởi ngôn ngữ như trong python.
Jim Schubert

Câu trả lời khác, có tính năng produc.format (), nên là câu trả lời được chấp nhận ... mặc dù vậy, tốt nhất là nó cũng sẽ đề cập đến chuỗi mẫu của ES6 (được thừa nhận là không tồn tại vào năm 2011). Chúng tôi thực sự có thể đánh cắp wiki những câu hỏi cũ để cập nhật chúng. : \
Kyle Baker

1
@FelixKling, vì bạn là câu trả lời được chấp nhận, bạn có thể cập nhật câu trả lời của riêng mình để chỉ ra các cách sử dụng đúng khác không?
Kyle Baker

1
Điều này thật tuyệt, các mẫu chữ không hoàn toàn giống nhau
truyền giáo

Tôi đã có một vấn đề trong khi sử dụng "đối số". Khi nhiều khách hàng chuyển từ phân tích cú pháp, "str" ​​đã bị xáo trộn. Có lời giải thích nào không?
muỗng cà phê

405

Với Node.js v4, bạn có thể sử dụng chuỗi Mẫu của ES6

var my_name = 'John';
var s = `hello ${my_name}, how are you doing`;
console.log(s); // prints hello John, how are you doing

Bạn cần phải quấn chuỗi trong backtick ` thay vì'


1
Plus 1 Bởi vì chúng tôi đang ở trong năm 2017 và ES6 về cơ bản là tiêu chuẩn trong thế giới nút.
Jankapunkt

1
Đây là (2017) câu trả lời đúng. Hãy lưu ý rằng bạn sẽ cần Babel trong chuỗi công cụ của mình để hỗ trợ các trình duyệt cũ hơn.
siêu sáng

3
Tôi đã đề xuất với các nhà phát triển node.js rằng nó sẽ thực sự hữu ích để làm cho nó rõ ràng trên các trang như nodejs.org/api/readline.html rằng đó là một backtick. Có một vấn đề cho nó ở đây: github.com/nodejs/docs/issues/55
Gail Foad

Tôi đã tự mình gài bẫy, cảm ơn vì đã bình luận;)
Overdrivr

3
Điều gì xảy ra nếu chuỗi của tôi là một phần của tệp cấu hình hello ${my_name}, how are you doingvà tôi muốn gán biến động sau khi đọc chuỗi từ cấu hình?
Amreesh Tyagi


43

node.js >4.0nó tương thích hơn với tiêu chuẩn ES6, trong đó thao tác chuỗi được cải thiện đáng kể.

Câu trả lời cho câu hỏi ban đầu có thể đơn giản như:

var s = `hello ${my_name}, how are you doing`;
// note: tilt ` instead of single quote '

Trường hợp chuỗi có thể trải rộng nhiều dòng, nó làm cho các mẫu hoặc các quy trình HTML / XML khá dễ dàng. Thêm chi tiết và nhiều capabilitie về nó: Mẫu chữ là chuỗi ký tự tại mozilla.org.


3
"nghiêng` thay vì trích dẫn đơn" "bạn có thể tiết kiệm trong ngày :)
Mario Binder

40

hồn.format làm điều này.

Nó sẽ là một phần của v0.5.3 và có thể được sử dụng như thế này:

var uri = util.format('http%s://%s%s', 
      (useSSL?'s':''), apiBase, path||'/');

3
Rất vui, cảm ơn vì tiền boa! console.log ('% s', value) cũng sẽ hoạt động.
Azat

14

Làm việc đó đi:

s = 'hello ' + my_name + ', how are you doing'

Cập nhật

Với ES6, bạn cũng có thể làm điều này:

s = `hello ${my_name}, how are you doing`

Bạn có nghĩa là "Nó không thể"? :? Nếu bạn muốn có văn bản hình thành, bạn có thể làm nó như được mô tả ở trên bởi Felix Kling. Đây là câu trả lời tốt nhất như tôi thấy ở đây;) :)
Merianos Nikos

@TIMEX Có thể dùng thử.
dev_khan

5

Một vài cách để mở rộng String.prototypehoặc sử dụng mẫu chữ ES2015 .

var result = document.querySelector('#result');
// -----------------------------------------------------------------------------------
// Classic
String.prototype.format = String.prototype.format ||
  function () {
    var args = Array.prototype.slice.call(arguments);
    var replacer = function (a){return args[a.substr(1)-1];};
    return this.replace(/(\$\d+)/gm, replacer)
};
result.textContent = 
  'hello $1, $2'.format('[world]', '[how are you?]');

// ES2015#1
'use strict'
String.prototype.format2 = String.prototype.format2 ||
  function(...merge) { return this.replace(/\$\d+/g, r => merge[r.slice(1)-1]); };
result.textContent += '\nHi there $1, $2'.format2('[sir]', '[I\'m fine, thnx]');

// ES2015#2: template literal
var merge = ['[good]', '[know]'];
result.textContent += `\nOk, ${merge[0]} to ${merge[1]}`;
<pre id="result"></pre>



3

Nếu bạn đang sử dụng node.js, console.log () lấy chuỗi định dạng làm tham số đầu tiên:

 console.log('count: %d', count);

Đây là một điểm tốt, nhưng câu hỏi là về nội suy chuỗi. console.log()chỉ xuất ra chuỗi được định dạng thành STDOUT. Nói cách khác, bạn không thể sử dụng kết quả củacount: %d
Jim Schubert

3

const format = (...args) => args.shift().replace(/%([jsd])/g, x => x === '%j' ? JSON.stringify(args.shift()) : args.shift())

const name = 'Csaba'
const formatted = format('Hi %s, today is %s and your data is %j', name, Date(), {data: {country: 'Hungary', city: 'Budapest'}})

console.log(formatted)


3

Tôi đã viết một chức năng giải quyết vấn đề chính xác.

Đối số đầu tiên là chuỗi muốn được tham số hóa. Bạn nên đặt các biến của mình trong chuỗi này như định dạng này "% s1,% s2, ...% s12" .

Các đối số khác là các tham số tương ứng cho chuỗi đó.

/***
 * @example parameterizedString("my name is %s1 and surname is %s2", "John", "Doe");
 * @return "my name is John and surname is Doe"
 *
 * @firstArgument {String} like "my name is %s1 and surname is %s2"
 * @otherArguments {String | Number}
 * @returns {String}
 */
const parameterizedString = (...args) => {
  const str = args[0];
  const params = args.filter((arg, index) => index !== 0);
  if (!str) return "";
  return str.replace(/%s[0-9]+/g, matchedStr => {
    const variableIndex = matchedStr.replace("%s", "") - 1;
    return params[variableIndex];
  });
}

Ví dụ

parameterizedString("my name is %s1 and surname is %s2", "John", "Doe");
// returns "my name is John and surname is Doe"

parameterizedString("this%s1 %s2 %s3", " method", "sooo", "goood");
// returns "this method sooo goood"

Nếu vị trí biến thay đổi trong chuỗi đó, hàm này cũng hỗ trợ nó mà không thay đổi các tham số hàm.

parameterizedString("i have %s2 %s1 and %s4 %s3.", "books", 5, "pencils", "6");
// returns "i have 5 books and 6 pencils."

2
var user = "your name";
var s = 'hello ' + user + ', how are you doing';

Tôi thấy một vài vấn đề với điều đó; nó sử dụng phép nối thay vì định dạng chuỗi là cờ đỏ đối với tôi khi thực hiện đánh giá mã, vì nó thường khó đọc và bảo trì hơn. Ngoài ra, bạn không thể lưu trữ "mẫu" đó một cách an toàn trong hệ thống truy xuất (như tệp cấu hình hoặc DB) và tiêm vào giá trị của người dùng sau này.
Rory Browne

1

Dưới đây là một ví dụ về chuỗi ký tự chuỗi nhiều dòng trong Node.js.

> let name = 'Fred'
> tm = `Dear ${name},
... This is to inform you, ${name}, that you are
... IN VIOLATION of Penal Code 64.302-4.
... Surrender yourself IMMEDIATELY!
... THIS MEANS YOU, ${name}!!!
...
... `
'Dear Fred,\nThis is to inform you, Fred, that you are\nIN VIOLATION of Penal Code 64.302-4.\nSurrender yourself IMMEDIATELY!\nTHIS MEANS YOU, Fred!!!\n\n'
console.log(tm)
Dear Fred,
This is to inform you, Fred, that you are
IN VIOLATION of Penal Code 64.302-4.
Surrender yourself IMMEDIATELY!
THIS MEANS YOU, Fred!!!


undefined
>

Nó được gọi là một chuỗi mẫu và bạn có thể muốn nâng cao câu trả lời hiện có này
Bergi

Ví dụ "chuỗi mẫu" này mà tôi đã chỉ cho IS là "chuỗi mẫu" sử dụng chuỗi ký tự chuỗi nhiều dòng.
Tình yêu và hòa bình - Joe Codwell 12/12/17
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.