【问题标题】:Edit key names in object of arrays from another object从另一个对象编辑数组对象中的键名
【发布时间】:2021-07-08 19:56:38
【问题描述】:

我希望能够重命名对象数组中的键。 我知道如何手动进行,一项一项。但我想做的是重命名另一个对象的键。

我的数据:

let data = [
    {f_name: 'Harry', l_name: 'Potter', address: 'Godrics Hollow', colors:'red'},
    {f_name: 'Ron', l_name: 'Weasley', address: 'The Burrow', colors:'orange'},
    {f_name: 'Hermione', l_name: 'Granger', address: '123 London', colors: 'blue'},
];

我的对象看起来像:

let obj = {'first_name': 'f_name', 'last_name': 'l_name', 'home': 'address'};

如您所见,obj 中的值与 data 中的键匹配。

我希望能够使用obj 中的键重命名data 中的键。

我可以用一个值来做到这一点,例如:

let colorName = 'colors';
const rename = data.map(d => {
    return ({colorName: d[colorName]});
});

我不知道如何使用 obj 执行此操作。

如何让我的最终 data 看起来像:

data = [
    {first_name: 'Harry', last_name: 'Potter', home: 'Godrics Hollow', colorName:'red'},
    {first_name: 'Ron', last_name: 'Weasley', home: 'The Burrow', colorName:'orange'},
    {first_name: 'Hermione', last_name: 'Granger', home: '123 London', colorName: 'blue'},
];

【问题讨论】:

标签: javascript jquery arrays object ecmascript-6


【解决方案1】:

如果你反转obj,会更容易。然后您可以使用Object.entriesObject.fromEntries 替换密钥:

const data = [
    {f_name: 'Harry', l_name: 'Potter', address: 'Godrics Hollow', colors:'red'},
    {f_name: 'Ron', l_name: 'Weasley', address: 'The Burrow', colors:'orange'},
    {f_name: 'Hermione', l_name: 'Granger', address: '123 London', colors: 'blue'},
  ],
  obj = {'f_name': 'first_name', 'l_name': 'last_name', 'address': 'home'};
  
const result = data.map(d => Object.fromEntries(
    Object.entries(d).map(([k, v]) => [obj[k] || k, v])
));

console.log(result);

【讨论】:

    【解决方案2】:

    您可以使用.map() 来做到这一点,如下所示:

    let data = [
        {f_name: 'Harry', l_name: 'Potter', address: 'Godrics Hollow', colors:'red'},
        {f_name: 'Ron', l_name: 'Weasley', address: 'The Burrow', colors:'orange'},
        {f_name: 'Hermione', l_name: 'Granger', address: '123 London', colors: 'blue'},
    ];
    let obj = {'first_name': 'f_name', 'last_name': 'l_name', 'home': 'address'};
    
    let mapped = data.map((person) => {
      // start with a basic template of the result object you want
      let template = {...obj};
      // now fill in the proper values for each key
      Object.entries(template).forEach(([key, value]) => {
        template[key] = person[value];
      })
      return template;
    });
    
    console.log(mapped);

    【讨论】:

      【解决方案3】:

      考虑以下示例,基于Changing the key name in an array of objects?

      let myData = [{
          f_name: 'Harry',
          l_name: 'Potter',
          address: 'Godrics Hollow',
          colors: 'red'
        },
        {
          f_name: 'Ron',
          l_name: 'Weasley',
          address: 'The Burrow',
          colors: 'orange'
        },
        {
          f_name: 'Hermione',
          l_name: 'Granger',
          address: '123 London',
          colors: 'blue'
        },
      ];
      
      let myElems = {
        'first_name': 'f_name',
        'last_name': 'l_name',
        'home': 'address'
      };
      
      $.each(myData, function(i, el) {
        var keys = Object.keys(myElems);
        $.each(keys, function(j, k) {
          el[k] = el[myElems[k]];
          delete el[myElems[k]]
        });
      });
      
      console.log(myData);
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

      这将操纵原始对象以现在具有新的键名。

      另一个例子,在函数中使用它:

      let myData = [{
          f_name: 'Harry',
          l_name: 'Potter',
          address: 'Godrics Hollow',
          colors: 'red'
        },
        {
          f_name: 'Ron',
          l_name: 'Weasley',
          address: 'The Burrow',
          colors: 'orange'
        },
        {
          f_name: 'Hermione',
          l_name: 'Granger',
          address: '123 London',
          colors: 'blue'
        },
      ];
      
      let myElems = {
        'first_name': 'f_name',
        'last_name': 'l_name',
        'home': 'address'
      };
      
      function changeKeys(dataObj, keyObj) {
        $.each(dataObj, function(i, el) {
          var keys = Object.keys(keyObj);
          $.each(keys, function(j, k) {
            el[k] = el[myElems[k]];
            delete el[myElems[k]]
          });
        });
        return dataObj;
      }
      
      myData = changeKeys(myData, myElems);
      console.log(myData);
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

      【讨论】:

      • 为什么要包含整个 jQuery 库只使用 JS 内置的 forEach?
      猜你喜欢
      • 2022-01-05
      • 1970-01-01
      • 2021-08-18
      • 2022-11-19
      • 1970-01-01
      • 2021-03-30
      • 2015-03-31
      • 1970-01-01
      • 2020-04-06
      相关资源
      最近更新 更多