我有一张看起来像的地图(它不是常数,可能会有更多的子阵列)
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组字符串的最佳方法是什么? 谢谢!
答案 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.