Есть ли способ, чтобы переименовать объект, ключи в JS с помощью подчеркивания.js
мне нужно преобразовать объект js в другой объект для передачи на серверный пост, где имена ключей отличаются, например
var a = {
name : "Foo",
amount: 55,
reported : false,
...
<snip/>
...
date : "10/01/2001"
}
должен превратиться в
a = {
id : "Foo",
total : 55,
updated: false,
...
<snip/>
...
issued : "10/01/2001"
}
где у меня есть поиск obj доступны для сопоставления всех ключей
var serverKeyMap = {
name : "id",
amount : "total",
reported : "updated",
...
date : "issue"
}
есть ли функция, доступная в подчеркивания.js или jQuery, что я могу использовать, что делает эту функциональность?
спасибо
10 ответов:
насколько я знаю, нет никакой функции, встроенной в любую из этих двух библиотек. Вы можете сделать свой собственный довольно легко, хотя: http://jsfiddle.net/T9Lnr/1/.
var b = {}; _.each(a, function(value, key) { key = map[key] || key; b[key] = value; });
Я знаю, что ты не упомянул лодашь и ответы уже решают проблему, но кто-то другой может воспользоваться альтернативой.
Как @CookieMonster писал в комментариях, вы можете сделать это с помощью
_.mapKeys:_.mapKeys(a, function(value, key) { return serverKeyMap[key]; });и скрипка:http://jsfiddle.net/cwkwtgr3/
подобно @pimvdb, вы также можете сделать это с помощью
_.reduce:_.reduce(a, function(result, value, key) { key = map[key] || key; result[key] = value; return result; }, {});Скрипка:http://jsfiddle.net/T9Lnr/39/
вы можете скопировать значения в новые свойства со стандартным JavaScript и удалить исходные свойства с помощью пропустить следующим образом:
a.id = a.name; a.total = a.amount; a.updated = a.reported; a = _.omit(a, 'name', 'amount', 'reported');
Это было решено здесь https://stackoverflow.com/a/30940370/1360897
var keyMapping = {'PropertyA': 'propertyA', ..., 'PropertyF': 'propertyNEW'}а также отображение старых и новых значений, как это
var valueMapping = {'Y': true, 'F': false}а затем с помощью _.карта и _.преобразование, вы можете преобразовать объект, как это
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; }); });
нет в любой библиотеке нет функции, которая явно переименовывает ключи. Ваш метод также является самым быстрым (см. тесты jsperf.) Лучше всего, если это возможно, рефакторинг либо на стороне клиента, либо на стороне сервера, чтобы объекты были одинаковыми.
У меня есть оператор преобразования и просто хотел бы применить его ко всем ключам. Я раздвоил скрипку pimvdb, чтобы создать простой пример. В этом случае он прописывает ключ. И он динамически строит клавиатуру, которая мне нужна для обеспечения работы (спасибо JSFiddle).
вот измененный код:
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; });Скрипка: http://jsfiddle.net/mr23/VdNjf/
// 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(); }Это может быть медленнее, чем ответов.
почему бы не использовать этот простой Java-скрипт ? Значение любого ключа: значение пары должно быть string / number / 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>
Как говорил пользователь2387823 выше используя пропустить - отличный вариант. Например, вы могли бы написать что-то вроде этого
function updateObjKey(obj, currentKey, newKey) { var keyValue = obj[currentKey]; obj = _.omit(obj, [currentKey]); obj[newKey] = keyValue; return obj; }
Comments