代码之家  ›  专栏  ›  技术社区  ›  jsh6303

“pickBy”对象的值数组中的值

  •  0
  • jsh6303  · 技术社区  · 6 年前

    我有一个对象,看起来像:

    let documents = {"A": [{"document":"test1", "serial":"123"}, {"document":"test2", "serial":"456N"}], "B": [{"document":"test3", "serial":"789N"}, {"document":"test24, "serial":"012"}]};
    

    我试图获取序列号以“N”结尾的筛选对象:

    {"A": [{"document":"test2", "serial":"456N"}, "B": [{"document":"test3", "serial":"789N"}]}
    

    我在做:

     let result = _.pickBy(documents, (docObjs, client) => {
           return _.filter(docObjs, ({serial}) => {
             return _.endsWith(serial, 'N');
           });
     });
    

    但我得到的是原始对象(与 documents ). 有什么问题吗?

    2 回复  |  直到 6 年前
        1
  •  4
  •   Ori Drori    6 年前

    洛达斯

    使用迭代客户端对象 _.transform() . 对于每个客户, filter 使用的文档列表 _.endsWith() . 如果文件列表不是 empty (长度0),将具有筛选文档列表的客户端分配给结果对象:

    // added client C that will be filtered out
    const documents = {"A": [{"document":"test1", "serial":"123"}, {"document":"test2", "serial":"456N"}], "B": [{"document":"test3", "serial":"789N"}, {"document":"test24", "serial":"012"}], "C": [{"document":"test25", "serial":"013"}]};
    
    const result = _.transform(documents, (r, v, k) => {
      const docs = _.filter(v, ({ serial }) => _.endsWith(serial, 'N'));
      if(!_.isEmpty(docs)) r[k] = docs;
    });
    
    console.log(result);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>

    获取客户端/文档对数组 Object.entries() . 使用 Array.map() Array.filter() 删除序列中不包含 String.endsWith() 字母N.使用 大堆筛选器() 删除包含0个文档的所有条目。使用转换回对象 Array.reduce() :

    // added client C that will be filtered out
    const documents = {"A": [{"document":"test1", "serial":"123"}, {"document":"test2", "serial":"456N"}], "B": [{"document":"test3", "serial":"789N"}, {"document":"test24", "serial":"012"}], "C": [{"document":"test25", "serial":"013"}]};
    
    const result = Object.entries(documents)
      // filter the least of documents in each client entry
      .map(([k, v]) => [k, v.filter(({ serial }) => serial.endsWith('N'))])
      // filter clients that have 0 documents
      .filter(([k, v]) => v.length)
      // convert back to an object
      .reduce((r, [k, v]) => (r[k] = v, r), {});
    
    console.log(result);
    <脚本src=”https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js“></script>
        2
  •  1
  •   Eddie    6 年前

    仅使用JS ES6 ,您可以使用 reduce 循环通过对象关键帧。 filter 数组和使用 endsWith 检查字符串是否以N结尾

    let documents = {"A": [{"document":"test1", "serial":"123"}, {"document":"test2", "serial":"456N"}], "B": [{"document":"test3", "serial":"789N"}, {"document":"test24", "serial":"012"}]};
    
    let result = Object.keys(documents).reduce((c, v) => {
      c[v] = documents[v].filter(o => o.serial.endsWith("N"));
      return c;
    }, {});
    
    console.log(result);

    文件编号: filter() , endsWith()