2012-01-05 26 views
46

tôi cần phải chuyển đổi một đối tượng js đối tượng khác để thông qua vào một bài đăng máy chủ nơi tên của các phím khác nhau ví dụCó cách nào để đổi tên phím đối tượng js sử dụng underscore.js

var a = { 
    name : "Foo", 
    amount: 55, 
    reported : false, 
    ... 
    <snip/> 
    ... 
    date : "10/01/2001" 
    } 

nhu cầu để biến thành

a = { 
    id : "Foo", 
    total : 55, 
    updated: false, 
    ... 
    <snip/> 
    ... 
    issued : "10/01/2001" 
    } 

nơi tôi có tra cứu obj sẵn để lập bản đồ tất cả các phím

var serverKeyMap = { 
    name : "id", 
    amount : "total", 
    reported : "updated", 
    ... 
    date : "issue" 
    } 

có funct ion có sẵn trong underscore.js hoặc jQuery mà tôi có thể sử dụng chức năng này?

cảm ơn

+3

Không gạch dưới, nhưng lodash có [_.mapKeys] (https://lodash.com/docs#mapKeys) để sửa đổi các khóa của đối tượng. – CookieMonster

Trả lời

26

Theo như tôi biết, không có hàm nào được tích hợp vào một trong hai thư viện này. Bạn có thể tự tạo cho mình một cách khá dễ dàng, mặc dù: http://jsfiddle.net/T9Lnr/1/.

var b = {}; 

_.each(a, function(value, key) { 
    key = map[key] || key; 
    b[key] = value; 
}); 
1

Không có chức năng nào trong thư viện đổi tên khóa một cách rõ ràng. Phương pháp của bạn cũng là nhanh nhất (xem jsperf tests.) Đặt cược tốt nhất của bạn, nếu có thể, là cấu trúc lại phía máy khách hoặc mã phía máy chủ để các đối tượng giống nhau.

+1

Các trường hợp thử nghiệm trong điểm chuẩn thậm chí không bằng nhau. – meandre

1

Tại sao bạn không sử dụng tập lệnh java đơn giản này? Giá trị của bất kỳ cặp khóa: giá trị nào phải là chuỗi/số/Boolean.

<script type="text/javascript">  
    var serverKeyMap = { 
     name : "id", 
     amount : "total", 
     reported : "updated" 
    }; 

    var a = { 
     name : "Foo", 
     amount: 55, 
     reported : false 
    }; 

    var b={}; // b is object where you will get your output 

    for(i in serverKeyMap) b[serverKeyMap[i]]=a[i]; 

    console.log(b); // It gives what you need. 

</script> 
1

Tôi có một toán tử chuyển đổi và chỉ muốn áp dụng cho tất cả các khóa. Tôi chia nhỏ câu đố của pimvdb để tạo ra một ví dụ đơn giản. Trong trường hợp này, nó viết hoa chìa khóa. Và nó tự động xây dựng sơ đồ bàn phím, mà tôi cần để đảm bảo công việc (nhờ JSFiddle).

Đây là mã thay đổi:

var keymap = {}; 
_.each(a, function(value, key) { 
    var oldkey = key; 
    key = capitalize(key); 
    keymap[oldkey] = key; 
}); 
_.each(a, function(value, key) { 
    key = keymap[key] || key; 
    b[key] = value; 
}); 

Fiddle: http://jsfiddle.net/mr23/VdNjf/

+0

Mặc dù ví dụ là giả tạo, trong thực tế, tôi đã sử dụng điều này để xây dựng sơ đồ bàn phím 'dọn dẹp' bằng bản ghi đầu tiên của tập dữ liệu và sau đó áp dụng nó cho phần còn lại (có thể bao gồm thêm 'tải' dữ liệu). – mr23

+0

tôi đã kết thúc bằng cách sử dụng giải pháp _.replace() ở trên, nhưng tôi đã bắt đầu bằng cách xem giải pháp và plunkr của bạn. hoạt động tốt. cảm ơn – FireDragon

36

Tương tự như @pimvdb, bạn cũng có thể làm điều đó với một _.reduce:

_.reduce(a, function(result, value, key) { 
    key = map[key] || key; 
    result[key] = value; 
    return result; 
}, {}); 

Fiddle: http://jsfiddle.net/T9Lnr/39/

+1

fiddle không hoạt động nữa – wegginho

+0

dường như vẫn hoạt động với tôi @wegginho, nó in ra giao diện điều khiển – dule

+0

Tôi nhận được lỗi rằng gạch dưới không được xác định – wegginho

34

Tôi biết bạn đã không đề cập đến lodash và câu trả lời đã giải quyết vấn đề, nhưng khi tôi đến đây tìm kiếm một cách để làm điều này với nó, tôi nghĩ ai đó có thể tận dụng lợi thế của một thay thế.

Như @CookieMonster đề cập trong các ý kiến, bạn có thể làm điều này với _.mapKeys:

_.mapKeys(a, function(value, key) { 
    return serverKeyMap[key]; 
}); 

Và fiddle: http://jsfiddle.net/cwkwtgr3/

+1

Các tác dụng phụ rất mạnh với tác vụ này. – DFlores009

2

Nó được giải quyết ở đây https://stackoverflow.com/a/30940370/1360897

var keyMapping = {'PropertyA': 'propertyA', ..., 'PropertyF': 'propertyNEW'} 

và cũng là một ánh xạ các giá trị cũ và mới, như thế này

var valueMapping = {'Y': true, 'F': false} 

Và sau đó sử dụng _.map và _.transform, bạn có thể chuyển đổi các đối tượng, như thế này

var result = _.map(allItems, function(currentObject) { 
    return _.transform(currentObject, function(result, value, key) { 
     if (key === 'PropertyF' || key === 'PropertyG') { 
      value = valueMapping(value); 
     } 
     result[keyMapping[key]] = value; 
    }); 
}); 
10

Bạn có thể sao chép các giá trị cho các thuộc tính mới với tiêu chuẩn JavaScript, và loại bỏ các thuộc tính ban đầu với bỏ, như sau:

a.id = a.name; 
a.total = a.amount; 
a.updated = a.reported; 
a = _.omit(a, 'name', 'amount', 'reported'); 
+0

Vui lòng thêm một số giải thích. Hiện tại, câu trả lời của bạn bị gắn cờ "chất lượng thấp" và có thể bị xóa. –

0

như user2387823 đang nói above sử dụng bỏ là một lựa chọn tuyệt vời. Ví dụ, bạn có thể viết một cái gì đó như thế này

function updateObjKey(obj, currentKey, newKey) { 
    var keyValue = obj[currentKey]; 
    obj = _.omit(obj, [currentKey]); 
    obj[newKey] = keyValue; 
    return obj; 
    } 
1
// key_map: {old_name1: new_name1, ... } 
function rename_keys(object, key_map, is_picked=false){ 
    keys = _.keys(key_map); 
    new_keys = _.values(key_map); 
    picked = _.pick(object, keys); 
    renamed = _.object(new_keys, _.values(picked)); 
    if(is_picked) return renamed; 

    return _.chain(object).omit(keys).extend(renamed).value(); 
} 

Điều này có thể chậm hơn so với câu trả lời ở trên.

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