【问题标题】:Es6- how change obj props name without looping?Es6-如何在不循环的情况下更改 obj 道具名称?
【发布时间】:2017-04-24 03:48:09
【问题描述】:

在 es6 中我有一个类似的数组

[{id:0,name:"a"},{id:1,name:"b"}]

我想改变它的道具名称而不映射或循环

 [{value:0,label:"a"},{value:1,label:"b"}]

我可以使用别名之类的函数吗?或任何其他替代方法?

首先感谢;

函数示例中的别名: 功能(ID:标签){ ...在这个函数标签中作为 id }

【问题讨论】:

  • “别名”是什么意思?如果不执行该操作 n 次,您将无法更改 n 次。
  • @guest271314:当然,很多人都想要这个。并不意味着它是可能的/合理的。
  • "array like" ... 你知道长度吗,它总是 2(或其他固定数字) - 如果不知道,那么你需要循环或使用 black majick
  • 如果您有诸如“没有映射或循环”之类的约束,那么您还必须告诉我们更多关于您的数据结构的信息。数组中是否总是最多有两个元素?对象是否总是只有这两个属性?

标签: javascript es6-class


【解决方案1】:

如果条目的数量是可变的,你可以使用代理

var thing = [{id:0,name:"a"},{id:0,name:"b"}]

var newThing = new Proxy(thing, {
    get: (target, name, receiver) => !isNaN(parseInt(name)) ? ({value:target[name].id, label:target[name].name}) : target[name]
});

console.log(newThing[0]); //Object { value: 0, label: "a" }

newThing.forEach(item => console.log(item));
//Object { value: 0, label: "a" }
//Object { value: 0, label: "b" }

如果value 是序数位置(正如您的示例输入/输出所暗示的那样)

var newThing = new Proxy(thing, {
    get: (target, name, receiver) => !isNaN(parseInt(name)) ? ({value:parseInt(name), label:target[name].name}) : target[name]
});

【讨论】:

  • "value" 索引 1 处对象的属性应为 1
  • @guest271314 - 我确信问题的输入数据中有错字(应该是 0 和 1,而不是 0 和 0)。主题行确实询问更改属性名称,而不是值。 (否则这实际上只是(甚至更多)对 OP 想要做什么的猜测。)
  • 我的答案涵盖了这两种情况:p 前瞻性思维,就是我
  • @JaromandaX 返回值是一个字符串,原来输入的是一个数字。
  • 很容易修复@guest271314 - 你不觉得吗 - 你当然还在假设value序数位置(我现在修好了)
【解决方案2】:

你可以使用对象解构,Array.prototype.shift()

let arr = [{id:0,name:"a"},{id:0,name:"b"}];

let res = [];

([{id:res[res.length], name:res[res.length]}
, {id:res[res.length], name:res[res.length]}] = arr);

arr = [{value:res.shift(), label:res.shift()}
      , {value:res.shift() + 1, label:res.shift()}];

console.log(arr);

【讨论】:

  • 这不是不必要的复杂吗?如果代码只适用于固定数量的元素,那么使用arr = [{value: arr[0].id, label: arr[0].name}, {value: arr[1].id, label: arr[1].name}] 一行代码会更短更容易理解吗?
  • @nnnnnn 是的,你的方法更简洁。
  • @nnnnnn 在较短的主题下,是否可以使用单个默认参数来实现stackoverflow.com/questions/43466657/… 的要求?
  • 根据最近的评论,the array length is not sure - 所以,数组长度为 2 的硬编码不起作用
  • @JaromandaX 同样的模式可以扩展到输入数组的.length。即满足“不循环”的要求。
猜你喜欢
  • 2011-11-02
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
  • 2019-11-02
  • 2011-09-18
  • 1970-01-01
相关资源
最近更新 更多