2017-02-05 2 views
0

Ein Array von etwa 5 oder mehr JavaScript-Objekten in diesem Format muss in [{gender:'man','age':'35'},{gender:'woman','age':'30'}] konvertiert werden.Ändern des Eigenschaftennamens von Objekten

Was ist ein effizienter Weg?

bearbeiten
Auch kann die Eingabe Array wie folgt sein, wo die Tasten vertauscht sind: [{'a':'man', 'age':'35'},{'age':'30', 'b':'woman'}] wo a, b, ... alles, und die Objekte im Array sein könnte konnte 10 Objekte bis zu.

+0

Ist es immer "a" und "b" oder müssen Sie den Wert überprüfen? – adeneo

+0

Effizient im Vergleich zu was? Was machst du gerade, das du als ungenügend empfindest? –

+0

Was ist los mit @NinaScholz Antwort dann? –

Antwort

3

Sie könnten Iterieren Sie das Array und iterieren Sie die Schlüssel und ändern Sie nur das Unbekannte Schlüssel zu 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

Sie sollten map Methode verwenden, die als Parameter eine callback Funktion akzeptiert.

Auch müssen Sie Object.keys(item)[0] verwenden, um den ersten Schlüssel zu erhalten.

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, bitte erklären Sie den Downvote. –

+0

Es gibt keine Garantie, dass 'Object.keys' die erwartete Eigenschaft in der Position '0' angibt. –

0

Um einen Eigenschaftsnamen eines Objekts zu ändern, müssen Sie zunächst eine neue gender Eigenschaft erstellen und löschen Sie die alte

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

Sie durch Felder Original-Array und Karte iterieren können Sie auf Felder, die Sie brauchen:

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

Dies ist eine vernünftige Art und Weise, dies zu tun, da die fraglichen Eigenschaften immer einen truthy Wert haben, was der Fall zu sein scheint.Obwohl eine bessere Erklärung als * "anders" * wäre gut. –

+0

Geändert, danke –

+0

@squint die Tasten a, b könnten zu viele sein, um den Operator '||' zu benutzen, und sie sind nicht im Voraus bekannt. –

0

Wie andere haben mit Vorschlägen kommen, So würde ich es machen:

würde ich die Schlüssel der Karte, auf die richtigen Tasten a|b => gender, age => age Oder eine Funktion definieren, die mir den richtigen Schlüssel geben sollte, basierend auf dem Wert (oder Typ) ..

einfache Zuordnung

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); 
Verwandte Themen