Javascript 在集合中搜索对象键

新手上路,请多包涵

是否可以使用 javascript“Set”对象来查找具有特定键的元素?像这样的东西:

 let myObjects = [{"name":"a", "value":0}, {"name":"b", "value":1},{"name":"c", "value":2}];
let mySet = new Set(myObjects);
console.log(mySet.has({"name":"a"}));

原文由 Alexandre Senges 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 304
2 个回答

不是那样,那会查找您传入的特定对象,该对象不在集合中。

如果您的起点是对象数组,则根本不需要 Set ,只需 Array.prototype.find

 let myObjects = [{"name":"a", "value":0}, {"name":"b", "value":1},{"name":"c", "value":2}];
let found = myObjects.find(e => e.name === "a");
console.log(found);

如果您已经有一个 Set 并想在其中搜索匹配项,则可以直接通过 for-of 使用它的迭代器:

 let myObjects = [{"name":"a", "value":0}, {"name":"b", "value":1},{"name":"c", "value":2}];
let mySet = new Set(myObjects);
let found = undefined; // the `= undefined` is just for emphasis; that's the default value it would have without an initializer
for (const e of mySet) {
  if (e.name === "a") {
    found = e;
    break;
  }
}
console.log(found);

…或通过 Array.from 间接地(重新)创建(the)一个数组,然后使用 find

 let myObjects = [{"name":"a", "value":0}, {"name":"b", "value":1},{"name":"c", "value":2}];
let mySet = new Set(myObjects);
let found = Array.from(mySet).find(e => e.name === "a");
console.log(found);

如果这是你需要经常做的事情,你可以给自己一个实用函数:

 const setFind = (set, cb) => {
  for (const e of set) {
    if (cb(e)) {
      return e;
    }
  }
  return undefined; // undefined` just for emphasis, `return;`
                    // would do effectively th same thing, as
                    // indeed would just not having a `return`
                    // at at all
}

let myObjects = [{"name":"a", "value":0}, {"name":"b", "value":1},{"name":"c", "value":2}];
let mySet = new Set(myObjects);
let found = setFind(mySet, e => e.name === "a");
console.log(found);

你甚至可以把它放在 Set.prototype 上(确保它是不可枚举的),但要小心与未来添加到 Set 的冲突( _例如_,如果 Set.prototype 在某些时候得到了 find 方法)。

原文由 T.J. Crowder 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可能只想要一组名称:

  let myObjects = [{"name":"a", "value":0}, {"name":"b", "value":1},{"name":"c", "value":2}];

let map = new Set(myObjects.map(el=>el.name));
console.log(map.has("a"));

如果你想通过名称获取对象,这就是 Map 的用途:

 let myObjects = [{"name":"a", "value":0}, {"name":"b", "value":1},{"name":"c", "value":2}];

let map = new Map(myObjects.map(el=>[el.name,el]));
console.log(map.get("a"));

原文由 Jonas Wilms 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题