2017-01-06 4 views
0

У меня есть список объектов:Изменить ключи списка объекта

userEvents : [ 
    {title : "now", start : "after", end : "when it ends"}, 
    {title : "now", start : "after", end : "when it ends"}, 
    {title : "now", start : "after", end : "when it ends"} 
] 

И я хочу, чтобы изменить ключи от объекта, как: title Я хочу, чтобы это было eventName, возможно ли это?

ответ

0

Да, вот так:

for(var i = 0; i < userEvents.length; i++) { 

    userEvents[i].eventName = userEvents[i].title; 
    delete userEvents[i].title; 
} 

Это работает, определив новое свойство eventName каждого объекта в списке userEvents, затем копирует ссылку на строку, а затем удалить старую title свойство. Основной объект строки, который имеет свойства title и eventNames, не изменяется и сохраняется.

(delete в JavaScript вызывает переменную или свойство становиться undefined, в то время как в C++ он вызывает ~T деструктор)

+0

Я думал, что будет построен в функции, но это будет сделано. Спасибо –

+0

@MoatezBouhdid Вы можете переименовать свойства за один проход, но только если они имеют один и тот же «прототип». Когда объекты определяются с использованием объектно-литеральной нотации Javascript (как в вашем примере), тогда нет наследования прототипов, поэтому для модификации объекта-конструктора или прототипа нет. – Dai

+1

Почему downvote? Пожалуйста, не занимитесь, не по крайней мере предоставляя конструктивную обратную связь в комментарии. – Dai

-1

Вы можете использовать Array.prototype.map вместо наивной реализации другого плаката. В наши дни лучше использовать более современный функциональный стиль.

userEvents.map(function(obj) { 
    obj.eventName = obj.title; 
}); 
+1

Мне любопытно, почему вы называете мое решение «наивным» :) или какой авторитет на JavaScript говорит, что функциональный стиль «лучший». – Dai

+0

Вы выделяете бесполезный массив. Не используйте «карту». – Oriol

0

Как об этом решении. Надеюсь, поможет!

var someobject = {userEvents : [{ 
 
    title: "now", 
 
    start: "after", 
 
    end: "when it ends" 
 
}, { 
 
    title: "now", 
 
    start: "after", 
 
    end: "when it ends" 
 
}, { 
 
    title: "now", 
 
    start: "after", 
 
    end: "when it ends" 
 
}]} 
 

 

 
for(var i = 0; i < someobject.userEvents.length; i++) { 
 
    var obj = someobject.userEvents[i]; 
 
    for(var j in obj){ 
 
     if(j === "title"){ 
 
      obj["eventName"] = obj[j]; 
 
      delete obj[j]; 
 
     } 
 
    } 
 
} 
 

 
console.log(someobject.userEvents);

0

Если вы после того, как автономный родовой функции, чтобы сделать это, достаточно просто издеваются что-то (кредит другие ответы здесь уже):

function rename_keys (obj_arr, key_map) { 
    return obj_arr.map(
    (obj) => { 
     for (var key in key_map) { 
     obj[ key_map[ key ] ] = obj[ key ]; 
     delete obj[ key ]; 
     } 
     return obj; 
    } 
); 
} 

Первый параметр - это массив объектов для изменения. Второй параметр - это объект, который определяет, какие ключи переименовать и к чему. Использование образца:

rename_keys(
    [ 
    {a:3,b:5}, {a:4,b:6} 
    ], 
    { 
    b:'c' 
    } 
); 
// results in: 
// [ 
// {a:3,c:5}, {a:4,c:6} 
// ] 

Примечание: это изменяет исходные объекты и возвращает новый массив из тех же объектов. Необходимо предпринять дополнительные шаги, если вы этого не хотите.

Примечание 2: в то время как в целом это не рекомендуется изменять основные объекты, если вы хотели вы могли сделать эту функцию членом любого массива:

Array.prototype.rename_keys = function (key_map) { 
    return rename_keys(this, key_map); 
}; 
// then, this is possible: 
userEvents.rename_keys({title: 'eventName'}); 
Смежные вопросы