【问题标题】:Checking if a string belongs to an array type value to a key in an object检查字符串是否属于数组类型值到对象中的键
【发布时间】:2017-05-13 19:36:15
【问题描述】:

假设我有一个名为“groups”的object,其中有值是数组的键:

let groups = {
    group1: ['A', 'B', 'C'],
    group2: ['X', 'Y', 'Z']
};
let item = 'B';

我将如何发现item 实际上在group1 中? (注意:会有很多组。我知道我可以使用 for 循环来遍历对象中的每个键。但是会有更快的方法吗?)

【问题讨论】:

  • 所以你想创建一个排序函数来返回具有包含所需项目的值的键?您可以获取所有密钥并对其进行过滤:Object.keys(groups).filter(key => groups[key].includes(item));.
  • 如果可以接受设置值而不是数组,这将大大加快搜索时间。我想说如果没有某种预排序,您至少需要遍历每个组。
  • 这两个我试试,谢谢。
  • 如果您坚持使用这种数据结构,那么是的,您需要迭代组对象中的每个键。如果您可以将数据结构更改为 hashmap(也称为字典),那么您可以快速查找该项目属于哪个组
  • @NinaScholz 是的,所有值都是唯一的

标签: javascript node.js object


【解决方案1】:

您可以使用Map 来引用组的键。

let groups = { group1: ['A', 'B', 'C'], group2: ['X', 'Y', 'Z'] },
    map = new Map,
    item = 'B';

Object.keys(groups).forEach(k => groups[k].forEach(v => map.set(v, k)));

console.log(map.get(item));

ES5

var groups = { group1: ['A', 'B', 'C'], group2: ['X', 'Y', 'Z'] },
    hash = Object.create(null),
    item = 'B';

Object.keys(groups).forEach(function (k) {
    groups[k].forEach(function (v) {
        hash[v] = k;
    });
});

console.log(hash[item]);

【讨论】:

  • 最好使用您的第一选择,for loop,因为这并没有更好。没有别的办法,只能遍历对象属性。
猜你喜欢
  • 2020-07-27
  • 1970-01-01
  • 2023-03-11
  • 2018-02-10
  • 2013-06-12
  • 2022-01-25
  • 2019-07-06
  • 2021-12-11
  • 2018-05-06
相关资源
最近更新 更多