解构地图

时间:2018-03-30 06:42:21

标签: javascript ecmascript-6

如果我在这样的javascript中有一个对象:

let obj = {b: 3, c: 4, d: 6}

如果我去构造它,我可以很容易地得到不同的部分,例如,如果我这样做,我可以得到c和d:

let {c, d} = obj

现在这很棒,但如果我想制作一张地图:

let m = new Map()
m.set('b', 3).set('c', 4).set('d', 6)

我可以通过以下方式获取单个元素:

let c = m.get('c')
let d = m.get('d')

但是有没有办法按照我们用标准对象的方式来构造像地图这样的对象。我发现上面的语法在很多情况下使用起来非常简单,它在使用地图时实际上是一个非常大的缺点;尽管你可以默认获得迭代器等等(在这里列出优势哈哈)。

7 个答案:

答案 0 :(得分:7)



const m = new Map();
m.set('b', 3)
 .set('c', 4)
 .set('d', 6);
 
const [[,b], [,c], [,d]] = [...m];

console.log(b, c, d);




const [[,b], [,c], [,d]] = [...m];

答案 1 :(得分:3)

你不能直接破坏Map,你必须先转换为对象或做一些异国情调,比如使用Proxy拦截来电。有这样的辅助函数:



function getFromMap (map) {
  return new Proxy(map, {
    get (obj, prop) {
      return obj.get(prop)
    }
  })
}

let m = new Map()
m.set('b', 3).set('c', 4).set('d', 6)

let {b, d} = getFromMap(m)
console.log(b, d)




答案 2 :(得分:1)

首先将Map转换为简单object

var obj = [...m.entries()].reduce( (acc, c) => ( 
 acc[c[0]] = c[1], 
 acc), {}); //convert to object

然后你可以解构相同的对象

<强>演示

&#13;
&#13;
let m = new Map()
m.set('b', 3).set('c', 4).set('d', 6);

var obj = [...m.entries()].reduce( (acc, c) => ( 
 acc[c[0]] = c[1], 
 acc), {}); //convert to object

//console.log(obj);
let { c, d } = obj; 
console.log(c, d);
&#13;
&#13;
&#13;

答案 3 :(得分:0)

没有内置的方法来构建Map,唯一要做的就是首先将它显式转换为对象:

&#13;
&#13;
const m = new Map();
m.set('b', 3)
  .set('c', 4)
  .set('d', 6);
const { b, c, d } = mapToObj(m);
console.log(d);

function mapToObj(inputMap) {
  const obj = {};
  for (const [key, value] of m) obj[key] = value;
  return obj;
}
&#13;
&#13;
&#13;

但是,如果您的密钥事先已知,并且不经常添加/删除,那么使用Map可能没什么好处 - 只需使用标准对象,您就可以进行本机构建。

答案 4 :(得分:0)

您可以使用getMultiple()返回包含所需键的对象,然后对结果进行解构:

&#13;
&#13;
const m = new Map([['b', 3], ['c', 4], ['d', 6]]);

const getMultiple = (m, ...keys) => Object.assign(...keys.map(k => ({ [k]: m.get(k) })))

const { b, d } = getMultiple(m, 'b', 'd')

console.log('b', b)
console.log('d', d)
&#13;
&#13;
&#13;

答案 5 :(得分:0)

那......

const mapAnObj = () => {
  const obj = { b: 3, c: 4, d: 6 }

  return Object.keys(obj).map(elem => obj[elem]);
};

console.log(mapAnObj());

也许我对问题的理解不正确,请纠正我。如果我错了,但这将为您带来完全相同的结果,并且有效且快捷。

答案 6 :(得分:0)

const map = new Map([['a',1],['b',2],['c',3]]);

const arr = [...map.values()];