更改对象的属性名称

4
一个包含大约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'}],其中a、b等可以是任何内容,数组中的对象最多可以有10个。

总是需要检查ab的值吗?还是说它们的值可能会变化? - adeneo
相比于什么而言是高效的?你现在做的事情有哪些让你感到不够有效率? - user1106925
那么,@NinaScholz的回答有什么问题吗? - vp_arth
那么 ab 可以是任何东西,但这些对象除了 age 之外还有其他属性吗?如果有,您打算如何过滤它们? - adeneo
@adeneo 不,除了年龄之外没有其他属性。 - Fred J.
在循环中检查'man'和'woman',然后将相关的键名更改为'gender'。简单 :) - m87
4个回答

7
你可以遍历原始数组并将你拥有的字段映射到你需要的字段:

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


这是一个不错的方法,因为相关属性始终具有真值,这似乎是正确的情况。不过,比“其他方式”更好的解释会更好。 - user1106925
@squint 键 a、b 可能太多,无法使用 || 运算符,并且它们事先不知道。 - Fred J.
请查看@NinaScholz的答案。 - vp_arth
@FredJ.:*"...并且它们事先是未知的"* 从一开始就包含这个信息会更好。那么我们是否知道对象永远不会有超过两个属性,其中一个是未知的,另一个是age - user1106925
@squint,是的。那是正确的,一个是年龄,另一个是未知的。 - Fred J.
1
@FredJ.:在这种情况下,假设属性是可枚举的,那么 arr = arr.map(o => ({age: o.age, gender: (delete o.age, o[Object.keys(o)[0]])})) 应该可以用最少的代码解决问题。如果不能保证可枚举,则应改用 Object.getOwnPropertyNames(o)[0]。我们之所以可以安全地通过这种方式获取属性,是因为我们删除了 .age,所以只剩下一个属性。 - user1106925

5
你可以遍历这个数组,然后遍历它的键,只将未知键更改为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);


对我来说很惊奇的是,没有直接更改属性名称的方法。 - steev

0
你应该使用接受回调函数作为参数的map方法。
此外,你必须使用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};
}));


Object.keys 不保证你期望的属性会在 0 位置。 - user1106925

0

像其他人提出的建議一樣,這是我會做的方法:

我會將鍵映射到正確的鍵上 a|b => gender, age => age 或定義一個函數,根據值(或類型)給我正確的鍵。

簡單映射

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接