加入地图键/值逗号分隔的最佳方法

时间:2017-10-23 20:14:26

标签: javascript ecmascript-6

我有一张看起来像的地图(它不是常数,可能会有更多的子阵列)

var mMp=    new Map([
    [ "A", [1, "r"] ],
    [ "B", [2, "d "]]
    ]);

我想去:

var ks = "A, B"
var vs1 = "1, 2"
var vs2 = "r, d"

我能做到

mMp.forEach( (val, key) => {.....};

我手动添加东西,但我必须检查最后一个值。我也想过

Array.from(mMp.keys()).join(", ");

但我认为这也无助于价值观。虽然我对这里的效率并不太担心,但它效率较低。

我能获得3组字符串的最佳方法是什么? 谢谢!

3 个答案:

答案 0 :(得分:2)

传播地图以获取entries,然后Array#reduce,然后使用Array#forEach将结果收集到单独的数组中。 Array#map数组到字符串,destructure结果用于分隔变量(在本例中为3):



const mMp = new Map([["A", [1, "r"]], ["B", [2, "d"]], ["C", [3, "e"]], [ "D", [2, "E"]], ["F", [3, "e"]]]);

const [ks, vs1, vs2] = [...mMp].reduce((r, [k, s]) => {
  [k, ...s].forEach((c, i) => r[i] ? r[i].push(c) : r.push([c]));
  
  return r;
}, []).map((arr) => arr.join(', '));

console.log(ks);
console.log(vs1);
console.log(vs2);




答案 1 :(得分:0)

以下适用于任意数量的键值对和任意长度的值数组:

LIKE

var mMp = new Map([ ["A", [1, "r"]], ["B", [2, "d "]] ]); const keys = Array.from(mMp.keys()) const vals = Array.from(mMp.values()) .reduce((p, c) => c.map((v, i) => [...(p[i] || []), v]), []) const [ks, ...vs] = [keys, ...vals].map(a => a.join(", ")) console.log(ks, vs[0], vs[1]); // "A, B", "1, 2", "r, d " 位是各种库中可用的.reduce函数的一种有点天真的实现。如果你可以使用lodash中的_.zip,那么使用它是个好主意。

答案 2 :(得分:0)

Array.from is indeed the way to go. For the values, use .values() instead of .keys() and the callback:

var mMp = new Map([
  ["A", [1, "r"]],
  ["B", [2, "d"]],
  // …
]);
var ks = Array.from(mMp.keys()).join(", "); // "A, B"
var vs1 = Array.from(mMp.values(), v => v[0]).join(", "); // "1, 2"
var vs2 = Array.from(mMp.values(), v => v[1]).join(", "); // "r, d"

If you have value arrays of arbitrary lengths, use a loop to create all your vs arrays.