Javascript 一个用于从ES 6中的对象获取某些属性的线性程序

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}) (请参阅本文中的可运行示例)

如何编写一个函数,在ES6中以最紧凑的方式只需要几个属性

我提出了使用destructuring+简化对象文字的解决方案,但我不喜欢代码中重复字段列表

有没有更苗条的解决方案

(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和厄尔