Javascript 一个用于从ES 6中的对象获取某些属性的线性程序
如何编写一个函数,在ES6中以最紧凑的方式只需要几个属性 我提出了使用destructuring+简化对象文字的解决方案,但我不喜欢代码中重复字段列表 有没有更苗条的解决方案Javascript 一个用于从ES 6中的对象获取某些属性的线性程序,javascript,ecmascript-6,ecmascript-harmony,destructuring,ecmascript-next,Javascript,Ecmascript 6,Ecmascript Harmony,Destructuring,Ecmascript Next,如何编写一个函数,在ES6中以最紧凑的方式只需要几个属性 我提出了使用destructuring+简化对象文字的解决方案,但我不喜欢代码中重复字段列表 有没有更苗条的解决方案 (v) => { let { id, title } = v; return { id, title }; } 这里有一些更精简的内容,尽管它不能避免重复字段列表。它使用“参数分解”来避免使用v参数 ({id, title}) => ({id, title}) (请参阅本文中的可运行示例)
(v) => {
let { id, title } = v;
return { id, title };
}
这里有一些更精简的内容,尽管它不能避免重复字段列表。它使用“参数分解”来避免使用
v
参数
({id, title}) => ({id, title})
(请参阅本文中的可运行示例)
@伊森·布朗的解决方案更一般。下面是一个更惯用的版本,它使用了对象.assign
和计算属性([p]
部分):
如果我们希望保留属性的属性,例如可配置
和getter和setter,同时也省略不可枚举的属性,那么:
function pick(o, ...props) {
var has = p => o.propertyIsEnumerable(p),
get = p => Object.getOwnPropertyDescriptor(o, p);
return Object.defineProperties({},
Object.assign({}, ...props
.filter(prop => has(prop))
.map(prop => ({prop: get(props)})))
);
}
这里有一些更精简的内容,尽管它不能避免重复字段列表。它使用“参数分解”来避免使用
v
参数
({id, title}) => ({id, title})
(请参阅本文中的可运行示例)
@伊森·布朗的解决方案更一般。下面是一个更惯用的版本,它使用了对象.assign
和计算属性([p]
部分):
如果我们希望保留属性的属性,例如可配置
和getter和setter,同时也省略不可枚举的属性,那么:
function pick(o, ...props) {
var has = p => o.propertyIsEnumerable(p),
get = p => Object.getOwnPropertyDescriptor(o, p);
return Object.defineProperties({},
Object.assign({}, ...props
.filter(prop => has(prop))
.map(prop => ({prop: get(props)})))
);
}
我不认为有任何方法可以使它比你的答案(或torazburo的答案)更简洁,但本质上你要做的是模仿。在ES6中重新实现这一点很容易:
function pick(o, ...fields) {
return fields.reduce((a, x) => {
if(o.hasOwnProperty(x)) a[x] = o[x];
return a;
}, {});
}
然后您就有了一个方便的可重用功能:
var stuff = { name: 'Thing', color: 'blue', age: 17 };
var picked = pick(stuff, 'name', 'age');
我不认为有任何方法可以使它比你的答案(或torazburo的答案)更简洁,但本质上你要做的是模仿。在ES6中重新实现这一点很容易:
function pick(o, ...fields) {
return fields.reduce((a, x) => {
if(o.hasOwnProperty(x)) a[x] = o[x];
return a;
}, {});
}
然后您就有了一个方便的可重用功能:
var stuff = { name: 'Thing', color: 'blue', age: 17 };
var picked = pick(stuff, 'name', 'age');
我有一个类似于Ethan Brown的解决方案,但更短的-
pick
函数。另一个函数pick2
稍长(且较慢),但允许以类似于ES6的方式重命名属性
const pick = (o, ...props) => props.reduce((r, p) => p in o ? {...r, [p]: o[p]} : r, {})
const pick2 = (o, ...props) => props.reduce((r, expr) => {
const [p, np] = expr.split(":").map( e => e.trim() )
return p in o ? {...r, [np || p]: o[p]} : r
}, {})
以下是使用示例:
const d = { a: "1", c: "2" }
console.log(pick(d, "a", "b", "c")) // -> { a: "1", c: "2" }
console.log(pick2(d, "a: x", "b: y", "c")) // -> { x: "1", c: "2" }
我有一个类似于Ethan Brown的解决方案,但更短的-
pick
函数。另一个函数pick2
稍长(且较慢),但允许以类似于ES6的方式重命名属性
const pick = (o, ...props) => props.reduce((r, p) => p in o ? {...r, [p]: o[p]} : r, {})
const pick2 = (o, ...props) => props.reduce((r, expr) => {
const [p, np] = expr.split(":").map( e => e.trim() )
return p in o ? {...r, [np || p]: o[p]} : r
}, {})
以下是使用示例:
const d = { a: "1", c: "2" }
console.log(pick(d, "a", "b", "c")) // -> { a: "1", c: "2" }
console.log(pick2(d, "a: x", "b: y", "c")) // -> { x: "1", c: "2" }
作为一条直线解决这个问题的诀窍是翻转所采用的方法:不从原始对象
orig
开始,而是从要提取的关键点开始
然后,使用one可以将所需的每个键存储在空对象上,该空对象作为所述函数的初始值传入
像这样:
const-orig={
身份证号码:123456789,
名称:'测试',
说明:“…”,
url:'https://…',
};
const filtered=['id','name'].reduce((结果,键)=>{result[key]=orig[key];返回结果;},{});
console.log(已过滤);//对象{id:123456789,name:“test”}
解决这个问题的诀窍是翻转所采取的方法:不从原始对象开始,而是从要提取的键开始
然后,使用one可以将所需的每个键存储在空对象上,该空对象作为所述函数的初始值传入
像这样:
const-orig={
身份证号码:123456789,
名称:'测试',
说明:“…”,
url:'https://…',
};
const filtered=['id','name'].reduce((结果,键)=>{result[key]=orig[key];返回结果;},{});
console.log(已过滤);//对象{id:123456789,name:“test”}
将使此操作非常流畅:
let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
z; // { a: 3, b: 4 }
(它确实有创建您可能不需要的x
和y
变量的缺点。)将使这一点变得非常巧妙:
let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
z; // { a: 3, b: 4 }
(它确实有创建您可能不需要的x
和y
变量的缺点。)我需要此解决方案,但我不知道建议的密钥是否可用。因此,我采用了@torazaburo答案,并针对我的用例进行了改进:
function pick(o, ...props) {
return Object.assign({}, ...props.map(prop => {
if (o[prop]) return {[prop]: o[prop]};
}));
}
// Example:
var person = { name: 'John', age: 29 };
var myObj = pick(person, 'name', 'sex'); // { name: 'John' }
我需要这个解决方案,但我不知道提议的钥匙是否可用。因此,我采用了@torazaburo答案,并针对我的用例进行了改进:
function pick(o, ...props) {
return Object.assign({}, ...props.map(prop => {
if (o[prop]) return {[prop]: o[prop]};
}));
}
// Example:
var person = { name: 'John', age: 29 };
var myObj = pick(person, 'name', 'sex'); // { name: 'John' }
使用逗号运算符的稍微短一点的解决方案:
const pick=(O,…K)=>K.reduce((O,K)=>(O[K]=O[K],O),{})
console.log(
挑选({姓名:'约翰',年龄:29岁,身高:198},'姓名','年龄')
)
使用逗号运算符的稍微短一点的解决方案:
const pick=(O,…K)=>K.reduce((O,K)=>(O[K]=O[K],O),{})
console.log(
挑选({姓名:'约翰',年龄:29岁,身高:198},'姓名','年龄')
)
您可以使用对象解构来从现有对象中解压属性,并在新的初始为空的对象的-字段中解压属性
const person={
fname:'汤姆',
名字:“杰瑞”,
aage:100,
}
让newPerson={};
({fname:newPerson.fname,lname:newPerson.lname}=person);
控制台日志(newPerson)代码>您可以使用对象分解来从现有对象和新的初始空对象的-字段中解压缩属性
const person={
fname:'汤姆',
名字:“杰瑞”,
aage:100,
}
让newPerson={};
({fname:newPerson.fname,lname:newPerson.lname}=person);
控制台日志(newPerson)代码>目前,有一种改进JavaScript对象速记语法的方法,可以在不重复的情况下“拾取”命名属性:
const source={id:“68646”,体裁:“犯罪”,标题:“疤脸”};
const target={};
assign(目标,{source.title,source.id});
控制台日志(已拾取);
//{id:“68646”,标题:“疤脸”}
不幸的是,这项提议似乎不会很快付诸实施。上一次编辑是在2017年7月,现在仍然是一份草稿,表明作者可能已经抛弃或忘记了它
ES5和厄尔