【问题标题】:Filter only few elements from an object by a specific key [duplicate]通过特定键仅过滤对象中的少数元素[重复]
【发布时间】:2018-07-15 18:53:18
【问题描述】:

我正在做这样的事情:

我的对象是这样的:

{
  a: 1,
  b: 2,
  c: 3,
  game01: 1,
  game02: 2,
  game03: 3
}

我需要做的是从它返回一个只包含最后 3 对的对象,所以它看起来像这样:

{
  game01: 1,
  game02: 2,
  game03: 3
}

我不希望手动执行此操作,但最好使用类似于过滤数组的方法。

谢谢!

【问题讨论】:

  • 你想要最后三个项目,还是以“游戏”开头的项目?
  • 对象的键没有顺序。因此,获取最后 3 项可能会显示不同的结果。

标签: javascript reactjs


【解决方案1】:

对象中没有真正的顺序概念,因此您无法可靠地提取对象的“最后三个键”。

但是,您可以遍历对象中的所有键,并仅在最终结果中包含具有 game 作为子字符串的键。

示例

const obj = {
  a: 1,
  b: 2,
  c: 3,
  game01: 1,
  game02: 2,
  game03: 3
};

const result = Object.keys(obj).reduce((result, key) => {
  if (key.includes('game')) {
    result[key] = obj[key];
  }
  return result;
}, {});

console.log(result);

【讨论】:

    【解决方案2】:

    您可以使用 Object.keys 遍历对象,然后切片最后 3 个键并从旧对象中创建一个新对象。

    var test = {
        a: 1,
        b: 2,
        c: 3,
        game01: 1,
        game02: 2,
        game03: 3
        }
        var newObject = {};
        Object.keys(test).slice(-3).forEach(ele=>newObject[ele] = test[ele]);
        console.log(newObject)
    

    【讨论】:

    • Object.keys 不保证相同的顺序
    • 好点,但没有其他方法可以保证相同的顺序。如果你认识任何人,请建议。
    • 只匹配其他答案中的部分键...否则结构需要不同
    • 在 OP 中,它没有说明键是否遵循某种模式。如果您有更多可用的游戏** 键怎么办?
    • 我猜这取决于用例。但是这里的证明顺序可以使用 Object.keys jsfiddle.net/qmjbw4cp/1
    【解决方案3】:

    您可以定义自己的过滤器方法,例如在Object 上,使其工作方式有点像Array#filter

    Object.from = arr => Object.assign(...arr.map( ([k, v]) => ({[k]: v}) ));
    Object.filter = (obj, predicate) => Object.from(Object.entries(obj).filter(predicate));
    
    // Example use:
    const obj = {a: 1, b: 2, c: 3, game01: 1, game02: 2, game03: 3 };
    
    const filtered = Object.filter(obj, ([key, value]) => key.includes("game")); 
    console.log(filtered);

    如您所见,我在这里定义了另一种方法,它本身就很有用:Object.from 从具有键/值对(子数组)的数组创建对象。它与Object.entries 的作用相反,为给定对象创建一个键/值对数组。

    【讨论】:

      【解决方案4】:

      您可以使用 Object.entries(obj) 将现有对象转换为数组数组(每个元素数组包含 [key,value]),然后循环检查每个键是否包含“游戏”子字符串.您可以将满足此条件的对象添加到某个新对象中。

      let obj = {
          a: 1,
          b: 2,
          c: 3,
          game01: 1,
          game02: 2,
          game03: 3
          };
      
      let substring="game";
      let key_value_pairs = Object.entries(obj);
      let newObj = {};
      
      key_value_pairs.forEach(element => {
          if(String(element[0]).includes(substring)){
              newObj[element[0]] = element[1];    
          }
      }); 
      //newObj will now be {game01: 1, game02: 2, game03: 3}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        • 2017-11-10
        • 2018-10-17
        • 1970-01-01
        • 2021-01-01
        相关资源
        最近更新 更多