Javascript 正在反转Object.entries转换

Javascript 正在反转Object.entries转换,javascript,ecmascript-6,Javascript,Ecmascript 6,我使用Object.entries从嵌套对象中获取一些值并对其进行过滤 obj = Object.entries(obj) .filter(([k, v]) => { return true; // some irrelevant conditions here }); 我的对象以数组、键和VAL的数组结束 [['key1', val]['key2', val']['key3', val]] 有没有一种简单的方法将这些映射回一个对象?原始对象结构是: { key:val

我使用
Object.entries
从嵌套对象中获取一些值并对其进行过滤

obj = Object.entries(obj)
  .filter(([k, v]) => {
    return true; // some irrelevant conditions here
  });
我的对象以数组、键和VAL的数组结束

[['key1', val]['key2', val']['key3', val]]
有没有一种简单的方法将这些映射回一个对象?原始对象结构是:

{ key:val, key2:val2, key3:val3 }

使用Object.assign与映射
[k,v]
=>
{[k]:v}

例如,下面的代码将只保留以
key

var obj={
重点:1,,
关键2:2,
关键3:3,
删除:4,
此外:5
}
obj=Object.assign({},…Object.entries(obj)
.filter(([k,v])=>{
返回k.startsWith('key');
})
.map(([k,v])=>({[k]:v}))
);

控制台日志(obj)当然,只需使用
.reduce
分配给新对象:

const input={key:'val',key2:'val2',key3:'val3'};
常量输出=对象。条目(输入)
.filter(([k,v])=>{
return true;//这里有一些不相关的条件
})
.减少((累计[k,v])=>{
累计[k]=v;
返回累计;
}, {});
控制台日志(输出)使用带和的reduce:


这将提供与CertainPerformance的答案相同的功能,语法更加简洁

对于新浏览器,请使用Object.fromEntries:

Object.fromEntries(arr); 
对于较旧的js,它仍然可以是一个单行线

arr.reduce((acc,[k,v])=>(acc[k]=v,acc),{})
例如:

Object.entries(sampleObject) // Turn object to array
   .reduce((acc,[k,v])=>(acc[k]=v,acc),{}) // Turn it back to object.

如果您确切知道要排除哪些条目,则可以使用对象解构与展开相结合的方法:

function clean(obj) {
  const { unwanted1, unwanted2, ...wanted } = obj;
  return { ...wanted };
}

在某些情况下,这可能是最干净的解决方案。

应该使它非常简单,只需在数组中循环,向结果对象添加属性。有什么问题吗?为什么要使用
Object.entries()
而不是
来表示(obj中的k)
?看起来你只是把事情弄得更复杂了。我同意你的看法,但是,
for..in循环在整个原型链上迭代,这实际上从来都不是你想要的。使用对象。{keys,values,entries},并在结果数组上迭代。
。这在这里并不重要,但我想练习编写可伸缩代码。@userqwert For in循环在整个原型链上迭代,而原型链实际上从未包含可枚举属性,所以这并不重要。要编写可伸缩的代码,只需为您的集合使用
映射即可。整洁!无法
返回{…想要的}简化为
需要返回?这也是ES 2018的一项功能,因此可能不太受广泛支持:工作完美@鸡,谢谢你的回答,你介意简短地解释一下ES6+行吗?一行可以工作,但不能通过带有“=v”后面逗号的eslint
function clean(obj) {
  const { unwanted1, unwanted2, ...wanted } = obj;
  return { ...wanted };
}