6

Tôi muốn làm như saucách để suy biến mẫu bên JavaScript đối tượng

var obj = { 
    animal: "${animal}" 
}; 

var res = magic(obj, {animal: "cat"}); 

// res => {animal: "cat"} 

magic là một số chức năng để làm công việc bẩn. Rõ ràng obj có thể phức tạp hơn với nhiều khóa, mảng lồng nhau, v.v. Biến mẫu có thể nằm trong một mảng như thế này

var obj = { 
    animals: ["cat", "dog", "${animal}", "cow"] 
}; 

và nó có thể ở bất kỳ đâu trong mảng đơn giản như vậy làm obj.animals[2] = "bat"; không khả thi.

Tôi đã tìm thấy underscore-tpl library mà tôi có thể đạt được những gì tôi muốn, nhưng tôi muốn biết nếu có các giải pháp khác để tham khảo trong tương lai và vì tôi đã có một thời gian khó tìm underscore-tpl ở nơi đầu tiên.

sử dụng thực tế của tôi là trường hợp là tôi có một tập tin config.json nơi tôi có một vài tờ khai như sau

{ 
    "task1": { 
    "command": "command-line-program", 
    "args": [ 
     "--input", "{{input}}", 
     "--flag1", 
     "--output", "{{output}}", 
     "--flag2", 
    ], 
    "options": { 
     "cwd": "path-to-working-dir" 
    } 
    } 
} 

tôi phân tích consig.json này sử dụng JSON.parse(...) và tôi gọi require("child_process").spawn với command, args và thông số options được khai báo trong tệp, tuy nhiên args thay đổi rất nhiều, cờ được thêm, sắp xếp lại và công cụ, vì vậy chỉ cần thực hiện config.task1.args[1] = "<input value>"; liên quan đến việc thay đổi mã gọi spawn và điều này dễ bị lỗi.

Cập nhật

Dựa trên the accepted answer tôi đã tạo ra một gói phần mềm đơn giản (located here) mà tôi có thể bao gồm trong các dự án của tôi, cảm thấy tự do để sử dụng nó.

+1

Tại sao không chỉ 'động vật: res.animal'? Nếu bạn cần nội suy ở giữa một chuỗi lớn hơn, hãy kiểm tra ES2015 [chuỗi mẫu] (http://es6-features.org/#StringInterpolation). * chỉnh sửa * oh OK Tôi thấy những gì bạn đang nhận được. – Pointy

+0

Tìm các công cụ mẫu JS. Lưu ý rằng yêu cầu tài nguyên ngoài trang web, thư viện, v.v. thực sự là OT cho SO. –

+0

@ DaveNewton Tôi thừa nhận đây không phải là câu hỏi tốt nhất mọi lúc :) Tôi thực sự chỉ muốn đặt thứ gì đó "ra khỏi đó", để tôi (và những người khác) có thể tìm thấy nó dễ dàng hơn, bởi vì tôi đã gặp khó khăn trong việc tìm kiếm một giải pháp không đau cho việc này. –

Trả lời

2

Bạn có thể JSON.stringify đối tượng, sau đó thay thế giá trị tìm kiếm của bạn với giá trị thực tế, sau đó JSON.parse kết quả:

function magic(o, a) { 
    var j = JSON.stringify(o); 
    for (var k in a) { 
      j = j.split('${'+k+'}').join(a[k]); 
    } 
    return JSON.parse(j); 
} 
+0

Tôi đã thử một cái gì đó như thế này, chỉ với regexes làm "tìm kiếm và thay thế" trên toàn bộ config.json của tôi. Tôi đã có vấn đề với thoát báo giá công cụ trong khi phân tích lại chuỗi để JSON, nhưng nói chung, yeah công trình này :) –

+1

Vâng, tôi đã ở lại với đề nghị của bạn, bởi vì điều này không thể nhận được đơn giản hơn. Tôi đã tạo một gói dựa trên [this] (https://github.com/kohanyirobert/tplobj). Tôi đã cập nhật mã để 'a [k]' sẽ được thoát đúng cách. Cho đến nay nó hoạt động cho tôi. Cảm ơn ý tưởng! –

+0

Giải pháp này dường như có mục đích phá vỡ bất ngờ, bởi vì nó không thoát khỏi chuỗi trong 'a'. (I E., nó sẽ hoạt động trên các trường hợp thử nghiệm đơn giản, nhưng sau đó đột nhập vào sản xuất khi bạn nhận được một chuỗi có chứa dấu trích dẫn hoặc dấu gạch chéo ngược hoặc somesuch) –

1

tôi gợi ý cho bạn một rất đơn giản nhưng rất nhanh và hiểu động cơ mẫu: simple-template.js

Nó bao gồm 22 dòng mã, rất đơn giản! Xem xét điều đó, bạn sẽ có thể hiển thị cấu hình của mình một cách dễ dàng!

Các vấn đề liên quan