从数组中的所有对象中获取特定键的值

Posted

技术标签:

【中文标题】从数组中的所有对象中获取特定键的值【英文标题】: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,但无论如何在内部它会使用一些循环。 【参考方案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')

【讨论】:

以上是关于从数组中的所有对象中获取特定键的值的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Javascript 中的对象列表中获取键的值?

从数组值中过滤字典

自定义对象在swift中减少类似键的值

如何从 PostgreSQL 中的 JSONB 数组中获取特定对象的值?

使用 NSPredicate 仅从字典数组中获取特定键的值

如何获取从 Knex 返回的值(数组中的对象,即数组中的对象)