【问题标题】:Is there a way to rename object properties based on values from another object?有没有办法根据另一个对象的值重命名对象属性?
【发布时间】:2021-06-17 16:11:03
【问题描述】:

我有一个对象和对象数组,如下所示:

object1 = {
  Material: ["Part ID"],
  Description: ["Desc"],
};

array1 = [
  { "Part ID": "ABC123", Desc: "sample part1" },
  { "Part ID": "DEF456", Desc: "sample part2" },
];

我希望创建一个新数组,该数组使用来自 object1 的匹配值代替 array1 中的键。

结果如下所示:

array2 = [
  { Material: "ABC123", Description: "sample part1" },
  { Material: "DEF456", Description: "sample part2" },
];

有没有一种优雅的方法来映射或循环来完成这个?

【问题讨论】:

  • 你已经找到了不优雅的方式了吗?请向我们展示您的尝试。
  • 我很接近,但我最终放弃了它,因为由于多个嵌套循环,一旦完成它会非常低效
  • 向帮助你的人展示你的尝试是有意义的

标签: javascript arrays object ecmascript-6


【解决方案1】:

相当很简单,但是你想要object 中的一个数组的事实使它有点棘手,试试这个:

let object1 = {
  Material: ["Part ID"],
  Description: ["Desc"],
};

let array1 = [
  { "Part ID": "ABC123", Desc: "sample part1" },
  { "Part ID": "DEF456", Desc: "sample part2" },
];

let array2 = array1.map((item) => {
  // Get the keys of the current item. (E.g. ["Part ID", "Desc"])
  const keys = Object.keys(item);
  // Initialize the new object to return.
  var out = {};
  // For each key of the current array item, map it to the correct key in object1
  for (let key of keys) {
    for (let obj_key in object1) {
      if (object1[obj_key].includes(key)) {
        out[obj_key] = item[key];
      }
    }
  }
  //Return this for mapping
  return out;
});

console.log(array2);

或者更短的函数:

let array2 = array1.map(r=>{var a,e={};for(a of Object.keys(r))for(var o in object1)object1[o].includes(a)&&(e[o]=r[a]);return e});

编辑:

我完全忘记了Object.entries()Object.fromEntries()!完成此操作的另一种方法是这样的(感谢@trincot 的回答):

array1
  .map((o) => Object.entries(object1).map(([k, v]) => [k, o[v]]))
  .map(Object.fromEntries);

【讨论】:

  • 这个解决方案完美运行,正是我想要的。谢谢!
  • @TWiii 如果对您有帮助,请点赞并标记为答案!
【解决方案2】:

您可以使用Object.entriesObject.fromEntries

let object1 = {Material: ["Part ID"], Description: ["Desc"]};
let array1 = [{"Part ID": "ABC123","Desc": "sample part1"}, {"Part ID": "DEF456","Desc": "sample part2"}];

let res = array1.map(o => Object.entries(object1).map(([k, v]) => [k, o[v]]))
                .map(Object.fromEntries);

console.log(res);

【讨论】:

    【解决方案3】:

    我希望这能解决您的问题。 该解决方案将以二次时间复杂度运行,这比过多的嵌套和搜索方法效率更高,相当于 O(n^2)。

    let object1 = {
      "Material": ["Part ID"], 
      "Description": ["Desc"]
    }
    
    let array1 = [
      { "Part ID": "ABC123", "Desc": "sample part1" },
      { "Part ID": "DEF456", "Desc": "sample part2" }
    ]
    
    let propertyNameMap = {};
    
    Object.keys(object1).map((key) => {
      object1[key].map((name) => {
        propertyNameMap[name] = key;
      });
    });
    
    
    let array2 = array1.map((item) => {
      let obj = {}
    
      Object.keys(item).map((key) => {
        let newKey = propertyNameMap[key];
        
        obj[newKey] = item[key];
      })
      
      return obj;
    })
    
    console.log(array2);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-14
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2017-01-12
      • 2020-12-06
      • 2015-04-09
      相关资源
      最近更新 更多