【问题标题】:How does one rename all of an object's keys within an array of objects?如何重命名对象数组中对象的所有键?
【发布时间】:2021-05-20 01:31:31
【问题描述】:

有没有办法改变对象数组中的键名?

代码: 更改键名的值列表。

var keys = {
    id:'identifier',
    facility:'site',
    status:'info',
    date:'days'
};

要更改键名的对象数组

var arrayObj = [{
    id:'jr210',
    facility:'earth',
    status:'sample info',
    date:'Feb 29, 2020'
},
{
    id:'tl980',
    facility:'mars',
    status:'sample info',
    date:'Jan 15, 2020'
}]

预期输出:

var newArrayObj = [{
        identifier:'jr210',
        site:'earth',
        info:'sample info',
        days:'Feb 29, 2020'
    },
    {
        identifier:'tl980',
        site:'mars',
        info:'sample info',
        days:'Jan 15, 2020'
    }]

【问题讨论】:

  • 能否请 OP 更详细地说明为什么这个 Q. 被标记为 typescript。提供的代码使用良好的旧 JavaScript 语法和 var 语句。
  • 您好@PeterSeliger,抱歉回复晚了。由于本周工作繁忙,我没有检查我的帐户。我一定会注意你说的话。

标签: javascript arrays typescript mapping reduce


【解决方案1】:

这是一个mapping 任务。与几乎所有数组方法map allows a 2nd argument, the thisArg 一样,上下文绑定到回调方法,因此在此类方法的应用/调用时可访问。

提供的方法实现了一个回调方法remapObjectWithBoundKeys,它利用其 this 上下文作为如何重新映射对象的每个键的配置。它通过reduceing 其键配置的entries 并通过迭代地assigning 新的键值对来创建一个新对象。

const sampleList = [{
  id:'jr210',
  facility:'earth',
  status:'sample info',
  date:'Feb 29, 2020',
}, {
  id:'tl980',
  facility:'mars',
  status:'sample info',
  date:'Jan 15, 2020',
}];

function remapObjectWithBoundKeys(item) {
  const keyConfig = this;
  return Object
    .entries(keyConfig)
    .reduce((obj, [recentKey, currentKey]) => Object.assign(obj, {
      [currentKey]: item[recentKey]
    }), {});
}

console.log(
  sampleList.map(remapObjectWithBoundKeys, {
    id: 'identifier',
    facility: 'site',
    status: 'info',
    date: 'days',
  })
);
.as-console-wrapper { min-height: 100%!important; top: 0; }

实现方法的优点是它独立于map 任务运行。一个人可以很容易地利用或重复使用它来创建任何类型的对象(重新)...

function remapObjectWithBoundKeys(item) {
  const keyConfig = this;
  return Object
    .entries(keyConfig)
    .reduce((obj, [recentKey, currentKey]) => Object.assign(obj, {
      [currentKey]: item[recentKey]
    }), {});
}

const planetType = {
  id:'tl980',
  facility:'mars',
  status:'sample info',
  date:'Jan 15, 2020',
};
const recreatePlanetItem = remapObjectWithBoundKeys.bind({
  id: 'identifier',
  facility: 'site',
  status: 'info',
  date: 'days',
});

console.log(
  planetType,
  recreatePlanetItem(planetType)
);
.as-console-wrapper { min-height: 100%!important; top: 0; }

【讨论】:

  • @thePeculiarCoder ...对上述方法有任何疑问吗?
【解决方案2】:

您可以使用reduceObject.entries 进行操作。

  1. reduce是对对象中的属性进行重新分组
  2. Object.entries是检索对象中的键值对。
type KeyForFinalResult = 'identifier'|'site'|'info'| 'days'
type KeyForReferenceKeys = 'id' | 'facility' | 'status' | 'date' 

type TempObjectType = {
    [T in KeyForReferenceKeys | string ]: string
}

type FinalObjectType = {
    [T in KeyForFinalResult | string]: string
}

var keys: TempObjectType  = {
    id:'identifier',
    facility:'site',
    status:'info',
    date:'days'
};


var arrayObj:TempObjectType[] = [{
    id:'jr210',
    facility:'earth',
    status:'sample info',
    date:'Feb 29, 2020'
},
{
    id:'tl980',
    facility:'mars',
    status:'sample info',
    date:'Jan 15, 2020'
}]


const result = arrayObj.reduce((finalResult: FinalObjectType[], elem)=>{
    let temp: FinalObjectType = {} as FinalObjectType

    Object.entries(keys).forEach((entry: string[] )=> {
        //each entry: [[key, value],[key1, value1]...]
        temp[entry[1]] = elem[entry[0]]
    })
    
    finalResult.push(temp)
 
    return finalResult
},[])


console.log(result)

【讨论】:

  • 我在 temp[entry[1]] 中遇到错误“类型‘未知’不能用作索引类型。
  • @thePeculiarCoder 检查我更新的答案。错误的原因是尚未指定类型并且打字稿无法推断。一旦添加了类型。问题可以解决。
猜你喜欢
  • 2020-11-26
  • 2018-05-17
  • 1970-01-01
  • 2020-06-02
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
相关资源
最近更新 更多