JavaScript - 从对象中提取值到数组的一行代码

4

这是一个很简单的问题:

我有一个JavaScript对象,其中一些属性的值是数组,结构如下:

let obj = {emails: ["xxx@yyy.com", "qqq@www.com"], nickname: ["asdf"],...}

我需要获取一个只包含值的数组,格式如下所示:
let obj2 = [["xxx@yyy.com"], ["qqq@www.com"], ["asdf"],...]

使用 Object.values(obj),我得到的是 [["xxx@yyy.com", "qqq@www.com"], ["asdf"],...],虽然不完全符合我的要求,但这是一个很好的起点...
另外,如果可能的话,我正在寻找一行代码来完成它。 有什么建议吗? 谢谢。

这不一样,我只需要值(而不是键),并且每个值都在单独的数组中... - andcl
2个回答

5

使用reduce函数的另一种方式。

这种方法将来自第一级的对象和数组相加。

正如您所看到的,这种方法评估了对象的类型。

let obj = {emails: ["xxx@yyy.com", "qqq@www.com"], nickname: ["asdf"]}

var result = Object.values(obj).reduce((a, c) => {
  if (Array.isArray(c)) return a.concat(Array.from(c, (r) => [r]));
  return a.concat([c]);
}, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

一行代码方法(不包括检查数组类型):

let obj = {emails: ["xxx@yyy.com", "qqq@www.com"], nickname: ["asdf"]},
    result = Object.values(obj).reduce((a, c) => (a.concat(Array.from(c, (r) => [r]))), []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


输出结果与 OP 想要的不一致。 - Pritam Banerjee
刚刚编辑了问题。 - andcl
谢谢。虽然另一个答案只有一行代码。 - andcl

4
您可以使用Object.values方法获取值数组,然后使用concat和展开语法...来获取扁平化数组,最后再使用map方法进行操作。

let obj = {emails: ["xxx@yyy.com", "qqq@www.com"], nickname: ["asdf"]}
const values = [].concat(...Object.values(obj)).map(e => [e])
console.log(values)


刚刚编辑了问题。 - andcl
非常好用,而且只需要一行代码。谢谢! - andcl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接