【问题标题】:Pulling single property from json when array of values are given给定值数组时从json中提取单个属性
【发布时间】:2017-09-22 19:30:59
【问题描述】:

如果提供了 id 数组,我们如何从 json 中检索名称。

[
   {
      "id": 0,
      "name": "salesTransNo"
   },
   {
      "id": 1,
      "name": "terminalNo"
   },
   {
      "id": 2,
      "name": "salesTransDate"
   },
   {
      "id": 3,
      "name": "salesTransTime"
   },
   {
      "id": 4,
      "name": "exceptionAmount"
   },
   {
      "id": 5,
      "name": "laneNumber"
   }
]

当给定 id 值的数组时,我只想从 JSON 中将名称检索到数组中

例如:id 的数组:[2,4,5]

输出应该是:

["salesTransDate","exceptionAmount","LaneNumber"]

我们如何使用 Lodash 或 JavaScript 实现这一点?

我使用_.find 并使用_.map 从结果中仅提取名称,但它仅适用于单个值,如果我要传递像 [2,4,5] 这样的数组,它不起作用。

【问题讨论】:

    标签: javascript typescript lodash


    【解决方案1】:

    您可以过滤对象,然后映射想要的属性。

    var data = [{ id: 0, name: "salesTransNo" }, { id: 1, name: "terminalNo" }, { id: 2, name: "salesTransDate" }, { id: 3, name: "salesTransTime" }, { id: 4, name: "exceptionAmount" }, { id: 5, name: "laneNumber" }],
        ids = [2, 4, 5],
        result = data
            .filter(({ id }) => ids.includes(id))
            .map(({ name }) => name);
    
    console.log(result);

    【讨论】:

      【解决方案2】:

      原版JS:

      var arr = [
         { "id": 0, "name": "salesTransNo"  },
         { "id": 1, "name": "terminalNo" },
         { "id": 2, "name": "salesTransDate" },
         { "id": 3, "name": "salesTransTime" },
         { "id": 4, "name": "exceptionAmount" },
         { "id": 5, "name": "laneNumber" }
      ];
      
      var indexes = arr.map ( function ( d ) { return d.id; });
      
      var id = 4; // Requested arr.id item
      var select_name = arr[indexes.indexOf(id)].name;
      

      如果你想返回多个结果,你可以像这样构建一个函数:

      function getNamesFromArr ( list_of_ids ) {
         var result = [];
         for ( var i = 0; i < list_of_ids.length; i++ ) {
            var indexes = arr.map ( function ( d ) { return d.id; });
            var select_name = arr[indexes.indexOf(list_of_ids[i])].name;
            result.push ( select_name );
         }
         return result;
      }
      
      getNamesFromArr ([ 2, 4, 5 ]); // Returns ["salesTransDate", "exceptionAmount", "laneNumber"]
      

      注意:为简单起见,我省略了错误处理。考虑捕获 -1 的 indexOf() 值。

      【讨论】:

        【解决方案3】:

        var items = [{
            "id": 0,
            "name": "salesTransNo"
          },
          {
            "id": 1,
            "name": "terminalNo"
          },
          {
            "id": 2,
            "name": "salesTransDate"
          },
          {
            "id": 3,
            "name": "salesTransTime"
          },
          {
            "id": 4,
            "name": "exceptionAmount"
          },
          {
            "id": 5,
            "name": "laneNumber"
          }
        ]
        
        var iname = items.filter(items => [2, 4, 5].includes(items.id));
        
        for (var names of iname)
        {console.log(names.name);}

        【讨论】:

          【解决方案4】:

          您可以使用_.keyBy()_.at()_.map() 对lodash 的链进行此操作:

          var data = [{ id: 0, name: "salesTransNo" }, { id: 1, name: "terminalNo" }, { id: 2, name: "salesTransDate" }, { id: 3, name: "salesTransTime" }, { id: 4, name: "exceptionAmount" }, { id: 5, name: "laneNumber" }];
          var ids = [2, 4, 5];
          
          var result = _(data)
            .keyBy('id') // convert to a dictionary by id
            .at(ids) // get the items which id match the id array
            .map('name') // pluck the name
            .value();
            
          console.log(result);
          &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"&gt;&lt;/script&gt;

          【讨论】:

            【解决方案5】:

            您可以使用lodash#intersectionWith,其中参数顺序必须是集合在前,ids在后,比较器在最后。

            var result = _.intersectionWith(data, ids, (a, b) => a.id == b);
            

            var data = [{
                id: 0,
                name: "salesTransNo"
              }, {
                id: 1,
                name: "terminalNo"
              }, {
                id: 2,
                name: "salesTransDate"
              }, {
                id: 3,
                name: "salesTransTime"
              }, {
                id: 4,
                name: "exceptionAmount"
              }, {
                id: 5,
                name: "laneNumber"
              }],
              ids = [2, 4, 5];
              
            var result = _.intersectionWith(data, ids, (a, b) => a.id == b);
            
            console.log(result);
            &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"&gt;&lt;/script&gt;

            【讨论】:

              猜你喜欢
              • 2022-10-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-01-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多