2017-02-05 3 views
0

Массив из 5 или более объектов javascript в этом формате [{'a':'man', 'age':'35'},{'b':'woman', 'age':'30'}] необходимо преобразовать в [{gender:'man','age':'35'},{gender:'woman','age':'30'}].Изменение свойства имени объекта

Что такое эффективный способ?

редактировать
Также массив ввода может быть, как это, где ключи переключаются вокруг: [{'a':'man', 'age':'35'},{'age':'30', 'b':'woman'}] где-нибудь, б, ... может быть и объекты в массиве может до 10 объектов.

+0

Всегда ли это 'a' и' b', или вам нужно проверить значение? – adeneo

+0

Эффективен по сравнению с чем? Что вы делаете сейчас, когда считаете себя недостаточным? –

+0

Что случилось с @NinaScholz? –

ответ

3

Вы могли бы итерации массива и итерации ключей и изменения только неизвестных ключ к gender.

var data = [{ a: 'man', age: '35' }, { b: 'woman', age: '30' }]; 
 

 
data.forEach(function (o) { 
 
    Object.keys(o).forEach(function (k) { 
 
     if (k !== 'age') { 
 
      o.gender = o[k]; 
 
      delete o[k]; 
 
     } 
 
    }); 
 
}); 
 

 
console.log(data);

0

Вы должны использовать метод map, который принимает в качестве параметра функцию callback.

Кроме того, для получения первого ключа необходимо использовать Object.keys(item)[0].

var array=[{'a':'man', 'age':'35'},{'b':'woman', 'age':'30'}]; 
 
console.log(array.map(function(item){ 
 
     return {gender: item[Object.keys(item)[0]],age:item.age}; 
 
}));

+0

@Downvoter, пожалуйста, объясните нижний предел. –

+0

Нет гарантии, что 'Object.keys' предоставит свойство, которое вы ожидаете в позиции' 0'. –

0

Чтобы изменить имя свойства объекта, необходимо сначала создать новый gender свойство, а затем удалить старый один

var arr  = [{'a':'man', 'age':'35'},{'b':'woman', 'age':'30'}]; 
 

 
arr.forEach(o => { 
 
    var k = Object.keys(o).find(x => x!=='age'); 
 
    o.gender = o[k]; 
 
    delete o[k]; 
 
}); 
 

 
console.log(arr)

3

Вы можете перебирать исходный массив и карты полей, которые вы должны полей вам необходимо:

var array=[{'a':'man', 'age':'35'},{'b':'woman', 'age':'30'}]; 
 
var newArray = array.map(function(item){ 
 
    return { 
 
    age: item.age, 
 
    gender: item.a || item.b 
 
    }; 
 
}); 
 
console.log(newArray);

+0

Это достойный способ сделать это, учитывая, что свойства, о которых идет речь, всегда будут иметь правдивое значение, что, кажется, так.Хотя лучшее объяснение, кроме «другого», было бы хорошим. –

+0

Изменено, спасибо –

+0

@squint ключей a, b может быть слишком много, чтобы использовать оператор '||', и они не известны заранее. –

0

Как и другие придумали предложения, вот как я это сделаю:

Я бы карту ключи, чтобы правильные ключи a|b => gender, age => age Или определить функцию, которая должна дать мне правильный ключ, на основе значения (или типа) ..

Простой Mapping

const keysMap = { 
    gender: ['a', 'b'], 
    age: 'age' 
}; 

// get it once. 
const rightKeys = Object.keys(keysMap); 
const rightKeysLen = rightKeys.length; 

function getRightKeyBy(key) { 
    for (let i = 0; i < rightKeysLen; i++) { 
    const condition = keysMap[rightKeys[i]]; 
    if (key === condition || 
     (condition instanceof Array && condition.indexOf(key) > -1)) { 
     return rightKeys[i] 
    } 
    } 
    // if no better key was found return the initial key 
    return key;  
} 

function convertKeys(obj) { 
    const newObj = {}; 
    Object.keys(obj).forEach(key => { 
    newObj[getRightKeyBy(key)] = obj[key]; 
    }); 

    return newObj; 
} 


var array = [{a: 'men', age: '25'},{b: 'woman', age: '35'}]; 
var correctArray = array.map(convertKeys); 

console.log(correctArray); 
Смежные вопросы