【问题标题】:How to loop inside a map() loop?如何在 map() 循环中循环?
【发布时间】:2021-12-17 15:37:35
【问题描述】:

以下脚本输出

================================================
Log entry ID: 1
UUID: 2
Timestamp: 3
--------------------
Log entry ID: 4
UUID: 5
Timestamp: 6

这就是我想要的。

现在description 是硬编码的,我希望使用arr 来构建它。

我目前的想法是在map() 函数中以某种方式生成内部数组:

[
    `Log entry ID: ${element['_id']}`,
    `UUID: ${element['_source'].uuid}`,
    `Timestamp: ${element['_source']['@timestamp']}\n`,
]

但是由于模板的原因,当单独查看它时,它甚至不是一个具有 3 个元素的有效数组。所以我完全没有想法。

问题

我想我必须以某种方式遍历arr 中的元素,然后才能将其提供给map()

有谁知道如何做到这一点?

const dedent = require('dedent');

const arr = [
  [ 'Log entry ID', '_id' ],
  [ 'UUID', 'uuid' ],
  [ 'Timestamp', '@timestamp' ],
]
;

const docs = [
  {'_id': 1,'_source': {'uuid': 2,'@timestamp': 3}},
  {'_id': 4,'_source': {'uuid': 5,'@timestamp': 6}},
];

const description = dedent`
================================================
${
  docs.map((element) => [
    `Log entry ID: ${element['_id']}`,
    `UUID: ${element['_source'].uuid}`,
    `Timestamp: ${element['_source']['@timestamp']}\n`,
  ].join('\n')).join('--------------------\n')
}
`;

console.log(description);

更新

我控制arr,所以将其更改为例如。是可能的,或者别的什么

const arr = [
  [ 'Log entry ID', '_id' ],
  [ 'UUID', {'_source': 'uuid'} ],
  [ 'Timestamp', {'_source': '@timestamp'} ],
]
;

【问题讨论】:

  • 您要访问的键具有不同的深度(_id:1、uuid:2 等),这有点令人困惑。你控制两个变量:arrdocs
  • @JohanDettmar 我控制arr,所以如果这样更容易的话,它的结构可以不同。
  • 如果您知道键对于docs 的整个项目都是唯一的,无论深度如何,仅对该键名称进行搜索就足够了。否则,我们将需要一条通往感兴趣值的唯一“关键路径”。
  • @JohanDettmar 如果_source 可以以某种方式包含在arr 的元素中,那么就不需要搜索了?
  • @JohanDettmar 我现在更新了 OP,在那里我建议了另一种构建 arr 的方法,所以希望不需要搜索?

标签: javascript node.js arrays json ecmascript-6


【解决方案1】:

假设docs数组元素的键都是唯一的,可以遍历对象寻找匹配的键。

function findVal(object, key) {
    var value;
    Object.keys(object).some(function(k) {
        if (k === key) {
            value = object[k];
            return true;
        }
        if (object[k] && typeof object[k] === 'object') {
            value = findVal(object[k], key);
            return value !== undefined;
        }
    });
    return value;
}


docs.map((element) =>
arr.map(([item, key]) =>
    `${item}: ${findVal(element, key)}`)
)

FindVal 取自 here

【讨论】:

    【解决方案2】:

    由于arr 在您的控制之下,也许您可​​以指定密钥本身的路径。

    const arr = [
      ['Log entry ID', '_id'],
      ['UUID', '_source.uuid'],
      ['Timestamp', '_source.@timestamp'],
      ['Description', '_source._desc']
    ];
    
    const docs = [{
        '_id': 1,
        '_source': {
          'uuid': 2,
          '@timestamp': 3,
          '_desc': 'test 1'
        }
      },
      {
        '_id': 4,
        '_source': {
          'uuid': 5,
          '@timestamp': 6,
          '_desc': 'test 2'
        }
      },
    ];
    
    const getValue = (object, keys) => keys.split('.').reduce((o, k) => (o || {})[k], object);
    
    console.log(docs.map((element) => arr.map((label) => {
      return `${label[0]}: ${getValue(element, label[1])}`
    }).join('\n')).join('\n--------------------\n'))

    【讨论】:

    • 您能解释一下getValue() 的作用吗?我以前从未使用过reduce(),所以我不太清楚getValue() 解决了什么问题?
    • getValue 方法将点表示法的 javascript 字符串转换为对象引用。基本上_source.uuid是从docs中获取uuid的关键,所以getValue会迭代到docs对象中去搜索_source.uuid
    【解决方案3】:

    你可以创建一个函数来从arr获取数据并放入描述

    /* Simple Hello World in Node.js */
    
    const arr = [
      [ 'Log entry ID', '_id' ],
      [ 'UUID', 'uuid' ],
      [ 'Timestamp', '@timestamp' ],
    ]
    ;
    
    const docs = [
      {'_id': 1,'_source': {'uuid': 2,'@timestamp': 3}},
      {'_id': 4,'_source': {'uuid': 5,'@timestamp': 6}},
    ];
    const findInArr=function(value){
        var t = ""
        arr.forEach(item=>{
            if (item.includes(value)) {t = item[0]}
            
        })
        return t
    }
    const description = dedent`
    ================================================
     ${
     docs.map((element) => [
        `${findInArr('_id')}: ${element['_id']}`,
        `${findInArr('UUID')}: ${element['_source'].uuid}`,
        `${findInArr('Timestamp')}: ${element['_source']['@timestamp']}\n`,
      ].join('\n')).join('--------------------\n')
    }`;
    
    console.log(description);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-02
      • 1970-01-01
      • 2020-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      • 2020-09-16
      相关资源
      最近更新 更多