【问题标题】:Getting the values for a specific key from all objects in an array从数组中的所有对象中获取特定键的值
【发布时间】:2014-10-17 15:54:25
【问题描述】:

我正在运行一个 express.js 应用程序,该应用程序具有一些向下拉框提供数据的 api。返回的数据格式为:

  [
    {
        key: 'blah',
        value: 'Blah Blah'
    },
    {
        key: 'foo',
        value: 'Foos'
    },
    {
        key: 'bar',
        value: 'Bars'
    },
    {
        key: 'baz',
        value: 'Bazingo'
    }
];

其中 key 是我的选项键,value 是显示文本。这个数组的结构是固定的,我知道我将始终将键和值作为数组中每个对象的字段。

当我尝试验证提交的表单(额外的服务器端验证)时,我想交叉引用为字段提供的值与数组中“key”的所有值(blah、foo、bar、巴兹)。鉴于这将是一个经常使用的路线,我想避免每次都遍历数组以找到允许的值。有没有更简单的方法来做到这一点?换句话说,我知道我可以使用:

 permittedValues = [];
 for (i = 0; i < array.length; i++){
    permittedValues[i] = array[i]["key"];
 }

但如果可能的话,我想避免这个 for 循环。

P.S:这似乎是一个基本问题,我在网上找到的答案并没有完全回答我的问题。所以,如果这个问题已经被问到并得到了回答,我们深表歉意。

【问题讨论】:

  • 没有循环是不可能的。
  • 你可以使用underscore pluck,但无论如何在内部它会使用一些循环。

标签: javascript json node.js express


【解决方案1】:

在当前版本的 Javascript 中,您需要对其进行循环。

但是你可以使用像 npm `lodash' 这样的模块来让它看起来更简单

var _ = require('lodash')
var permittedValues = _.pluck(array, 'key')

link to pluck documentation

【讨论】:

  • _.pluck 不再是 lodash 函数 =(
【解决方案2】:

你可以map:

permittedValues = array.map(function(value) {
  return value.key;
});

在 ES6/ES2015 中,arrow functions 更漂亮:

permittedValues = array.map(value => value.key);

它可能更漂亮,但它可能不会比for() 循环快。

【讨论】:

    【解决方案3】:

    您可以通过映射提取值,并将它们形成一个正则表达式以匹配值。

    示例:http://repl.it/X0V

    var items=
    [
        {
            key: 'blah',
            value: 'Blah Blah'
        },
        {
            key: 'foo',
            value: 'Foos'
        },
        {
            key: 'bar',
            value: 'Bars'
        },
        {
            key: 'baz',
            value: 'Bazingo'
        }
    ];
    
    var toReg = items.map(function(obj){
        return obj.key; 
    }).join('|');
    var regex = new RegExp('^('+ toReg +')$');
    
    //To test the regex
    var itemsToTest = ['blah', 'Pies', 'foo', 'Bazingo'];
    itemsToTest.forEach(function(key){
       if(regex.test(key)){
           console.log(key);
       }
    });
    

    【讨论】:

      【解决方案4】:

      使用 lodash,

      从 lodash 4.x 开始,_.pluck 函数已被移除以支持 map 函数。

      因此您可以通过以下方式完成所需的任务:

      import _ from 'lodash'
      _.map(items, 'key');
      

      参考:What happened to Lodash _.pluck?

      【讨论】:

        【解决方案5】:

        如果您使用的是 ES6 javascript 版本,您可以执行以下操作:

        const arrayData = [
            {
                key: 'blah',
                value: 'Blah Blah'
            },
            {
                key: 'foo',
                value: 'Foos'
            },
            {
                key: 'bar',
                value: 'Bars'
            },
            {
                key: 'baz',
                value: 'Bazingo'
            }
        ];
        const foodBar = arrayData.find(item => item.key === "baz");
        const resultValue = foodBar['value']; // here the extracted value is by key
        

        【讨论】:

          【解决方案6】:

          试试这个..

          const myArray = [
              {
                  key: 'blah',
                  value: 'Blah Blah'
              },
              {
                  key: 'foo',
                  value: 'Foos'
              },
              {
                  key: 'bar',
                  value: 'Bars'
              },
              {
                  key: 'baz',
                  value: 'Bazingo'
              }
          ];
          const resObject = myArray.find(item => item.key === "foo");
          // Here you can access object which you want
          console.log(resObject);

          你也可以参考这个答案..

          Find object by id in an array of JavaScript objects

          【讨论】:

            【解决方案7】:

            纯 JavaScript ES6

            array.map(value => value.key);
            

            下划线/Lodash

            _.map(value,'key')
            

            【讨论】:

              猜你喜欢
              • 2022-08-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-09-26
              • 2020-07-20
              • 1970-01-01
              相关资源
              最近更新 更多