假设我有一个对象:
elmo = {
color: 'red',
annoying: true,
height: 'unknown',
meta: { one: '1', two: '2'}
};
我想用它的属性子集创建一个新对象。
// pseudo code
subset = elmo.slice('color', 'height')
//=> { color: 'red', height: 'unknown' }
我怎样才能做到呢?
假设我有一个对象:
elmo = {
color: 'red',
annoying: true,
height: 'unknown',
meta: { one: '1', two: '2'}
};
我想用它的属性子集创建一个新对象。
// pseudo code
subset = elmo.slice('color', 'height')
//=> { color: 'red', height: 'unknown' }
我怎样才能做到呢?
当前回答
我也有同样的问题,并通过使用以下lib轻松解决了它:
object.pick
https://www.npmjs.com/package/object.pick
pick({a: 'a', b: 'b', c: 'c'}, ['a', 'b'])
//=> {a: 'a', b: 'b'}
object.omit
https://www.npmjs.com/package/object.omit
omit({a: 'a', b: 'b', c: 'c'}, ['a', 'c'])
//=> { b: 'b' }
其他回答
使用“with”语句的简写对象文字语法
还没有人演示过这种方法,可能是因为它很糟糕,你不应该这么做,但我觉得必须把它列出来。
Var o = {a:1,b:2,c:3,d:4,e:4,f:5} (o) { Var输出= {a,b,f} } console.log(输出)
利:你不需要输入两次属性名。
缺点:由于许多原因,不建议使用“with”语句。
结论:它很有效,但不要使用它。
将参数转换为数组 使用Array.forEach()来选择属性 Object.prototype.pick = function(…args) { Var obj = {}; arg游戏。forEach(k => obj[k] = this[k]) 返回obj } Var a = {0:"a",1:"b",2:"c"} var b = a.pick(' 1 ', ' 2 ') / /输出将{1:“b”,2:“c”}
我知道它不是最干净的,但它简单易懂。
function obj_multi_select(obj, keys){
let return_obj = {};
for (let k = 0; k < keys.length; k++){
return_obj[keys[k]] = obj[keys[k]];
};
return return_obj;
};
我发现最简单的方法,它不会创建不必要的变量,是一个函数,你可以调用,工作原理与lodash相同,如下所示:
pick(obj, keys){
return Object.assign({}, ...keys.map(key => ({ [key]: obj[key] })))
}
例如:
pick(obj, keys){
return Object.assign({}, ...keys.map(key => ({ [key]: obj[key] })))
}
const obj = {a:1, b:2, c:3, d:4}
const keys = ['a', 'c', 'f']
const picked = pick(obj,keys)
console.log(picked)
Pick = (obj, keys) => { 返回对象。分配({},…键。Map (key => ({ (例子):obj(例子) }))) } Const obj = { 答:1, b: 2 c: 3, d: 4 } Const keys = ['a', 'c', 'f'] Const selected = pick(obj, keys) console.log(选)
如何:
function sliceObj(obj) {
var o = {}
, keys = [].slice.call(arguments, 1);
for (var i=0; i<keys.length; i++) {
if (keys[i] in obj) o[keys[i]] = obj[keys[i]];
}
return o;
}
var subset = sliceObj(elmo, 'color', 'height');