zoukankan      html  css  js  c++  java
  • [Ramda] Get a List of Unique Values From Nested Arrays with Ramda (flatMap --> Chain)

    In this lesson, we'll grab arrays of values from other arrays, resulting in a nested array. From there, we'll look at multiple ways to flatten the array structure using composition with map and unnest and then refactoring to use chain, AKA flatMap. Finally, we'll add Ramda's uniq function to remove duplicate values.

    const R = require('ramda');
    
    const {map, chain, prop, pluck, compose, uniq, tap, curry} = R;
    
    const product = {
        name: "Sample Data",
        sizes: [
            {
                name: "L",
                colors: [
                    {
                        name: "Red"
                    },
                    {
                        name: "Blue"
                    }
                ]
            },
            {
                name: "M",
                colors: [
                    {
                        name: "Green"
                    },
                    {
                        name: "Yellow"
                    }
                ]
            },
            {
                name: "S",
                colors: [
                    {
                        name: "Orange"
                    },
                    {
                        name: "Purple"
                    },
                    {
                        name: "Blue"
                    }
                ]
            }
        ]
    };
    
    const log = curry((desc, x) => R.tap(() => console.log(desc, JSON.stringify(x, null, 2)), x));
    
    // Target: to get unique array of color from product object
    
    const sizes = prop('sizes');
    const getColors = chain(prop('colors')); // flatMap, get colors props from array of objects
    const getColorNames = pluck('name'); // get name prop from array of objects
    const res = compose(
        uniq,
        log("after name"),
        getColorNames,
        log("after colors"),
        getColors,
        log("after sizes"),
        sizes
    )(product);
    
    console.log(JSON.stringify(res, null, 2));
    /*
    * after sizes [
      {
        "name": "L",
        "colors": [
          {
            "name": "Red"
          },
          {
            "name": "Blue"
          }
        ]
      },
      {
        "name": "M",
        "colors": [
          {
            "name": "Green"
          },
          {
            "name": "Yellow"
          }
        ]
      },
      {
        "name": "S",
        "colors": [
          {
            "name": "Orange"
          },
          {
            "name": "Purple"
          },
          {
            "name": "Blue"
          }
        ]
      }
    ]
    after colors [
      {
        "name": "Red"
      },
      {
        "name": "Blue"
      },
      {
        "name": "Green"
      },
      {
        "name": "Yellow"
      },
      {
        "name": "Orange"
      },
      {
        "name": "Purple"
      },
      {
        "name": "Blue"
      }
    ]
    after name [
      "Red",
      "Blue",
      "Green",
      "Yellow",
      "Orange",
      "Purple",
      "Blue"
    ]
    [
      "Red",
      "Blue",
      "Green",
      "Yellow",
      "Orange",
      "Purple"
    ]
    * */
  • 相关阅读:
    Java 到底是值传递还是引用传递
    Java.lang.Comparable接口和Java.util.Comparator接口的区别
    线程安全和线程不安全的区别
    剑指offer第五天
    快速排序法
    剑指offer第四天
    length()方法,length属性和size()的方法的区别
    linux 下创建管理员权限账户
    Centos6.5 rpm方式指定目录安装JDK
    阿里云云服务器硬盘分区及挂载
  • 原文地址:https://www.cnblogs.com/Answer1215/p/6480706.html
Copyright © 2011-2022 走看看