【问题标题】:Using map() and/or reduce() to simplify a forEach() statement in Node (or native JavaScript)使用 map() 和/或 reduce() 来简化 Node(或原生 JavaScript)中的 forEach() 语句
【发布时间】:2017-02-07 19:10:33
【问题描述】:

我有一些数据:

var rows = [{
    name: "name1",
    description: "description1",
    value: 101
}, {
    name: "name2",
    description: "description2",
    value: 202
}]

纯粹是为了好玩,我想把它变成一个包含匹配数据点数组的对象键矩阵。这是我使用forEach() 工作的单行代码:

var o = {}
rows.forEach(row => Object.keys(row).forEach(key => (o[key] === undefined) ? o[key] = [row[key]] : o[key].push(row[key])))

console.log(o)

/*
{
    name: ['name1', 'name2'],
    description: ['description1', 'description2'],
    value: [101, 202]
}
*/

我感觉我仍然可以使用 map() 和/或 reduce() 来缩短这个表达式,但到目前为止我完全受阻!

此外,我们假设密钥是一致的,但并不总是已知的。

【问题讨论】:

  • 不会显着简化它...即使在 reduce() 中仍然需要迭代每个对象键
  • 好吧,简化是一个坏词——缩短是一个更好的词。

标签: javascript arrays node.js mapreduce


【解决方案1】:

如果键值一致,你可以这样做:

var matrix = Object.keys(rows[0]).reduce((o, key) => ( o[key] = rows.map(row => row[key]), o), {});

【讨论】:

  • 不错!超级光滑。
【解决方案2】:

您可以使用带有快捷方式的Array#reduce 来检查属性是否存在。

var rows = [{ name: "name1", description: "description1", value: 101 }, {  name: "name2", description: "description2", value: 202 }],
    obj = rows.reduce(
        (o, row) => (
            Object.keys(row).forEach(key => (o[key] = o[key] || []).push(row[key])),
            o
        ),
        {}
    );

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

【讨论】:

  • 到目前为止,这看起来是最好的答案。我真的不明白我们怎么能比这更简洁!谢谢妮娜。
【解决方案3】:

使用lodash 可以做到这一点

var rows = [{
    name: "name1",
    description: "description1",
    value: 101
}, {
    name: "name2",
    description: "description2",
    value: 202
}];
 
var combined = _.mergeWith(...rows, (o, s) => _.castArray(o).concat(_.castArray(s)));

console.log(combined);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多