【问题标题】:How does one filter an array of objects by each object item's property name?如何通过每个对象项的属性名称过滤一组对象?
【发布时间】:2021-10-23 09:17:32
【问题描述】:

我对编码有点陌生,如果我听起来很愚蠢,很抱歉。这是我的问题: 我有一个对象数组,想通过对象键的开头对其进行过滤。

[{
  a_1: 356
}, {
  a_2: 348
}, {
  b_1: 621
}, {
  c_9: 311
}, {
  b_8: 123
}, {
  a_8: 787
}]

结果应该是这样的,所以只有key以“a”开头的对象才能通过过滤器:

[{
  a_1: 356
}, {
  a_2: 348
}, {
  a_8: 787
}]

提前谢谢你!

【问题讨论】:

  • 欢迎来到 SO!为什么你首先有具有不同键的对象?对象数组通常都应该具有相同的键,这样您就可以可预测地迭代和索引,而不必一直调用Object.keys,这是一个几乎违背对象用途的函数。您可能需要重新考虑您的数据结构。这些对象是否只有一个键?请显示确切的结构(这是伪代码)以及您的尝试。谢谢。
  • @Robson 感谢您这么快回复!抱歉,如果我没有以最实际的方式做出回应,我仍然是 SO 的新手。是的,我用的是js!
  • @ggorlen 感谢您这么快回复!抱歉,如果我没有以最实际的方式做出回应,我仍然是 SO 的新手。我正在从我的世界服务器(hypixel)获取 API。在这种模式下,您每周都会向玩家提供“饼干”,作为他们构建的奖励。 API 充满了“given_cookies_[number]”对象,其中 [number] 是周数。 (例如:given_cookies_105126)。我只需要删除所有内容并保留以“given_cookies”开头的对象,然后我可以自己解决剩下的问题。编辑:语法错误
  • 您可以/应该edit your post 修复错误并显示准确的输入/输出结构——根据书面描述很难判断它是什么。谢谢。如果 API 响应很奇怪,您可能需要先对其进行转换,然后再对其进行进一步操作。当有"foo_[number]": val时,最好作为一个数组,"foo": [val, ...]

标签: javascript object filter


【解决方案1】:

您可以编写一个辅助函数,使其行为类似于 array.filter,并根据您的特定需求进行不同的实现...

希望对你有帮助

let testCase1 ={
    a_1: 356, 
    a_2: 348, 
    b_1: 621, 
    c_9: 311, 
    b_8: 123, 
    a_8: 787,
}
 const testCase2=  [
    {
        a_1: 356,
        x:"something"
    }, 
    {
        a_2: 348,
        x:"something"
    },
    {
        b_1: 621,
        x:"something"
    },
    {
        c_9: 311,
        x:"something"
    },
    {
        b_8: 123,
        x:"something"
    },
    {
        a_8: 787,
        x:"something"
    }
]

// array filter like function
const objectFilter=(obj,check = (key,value)=>true )=>{
    const res = Object.keys(obj)
        .filter(key => check(key,obj[key]))
        .reduce((acc,current)=>({...acc,...{[current]:obj[current]}}),{})
        
    if(Object.keys(res).length > 0){
        return res
    }
}

// return an array with new objects containing only the filtered keys
const objectArrayFilter=(arr, check = (key,value)=>true)=>{
    return arr.map(item=>objectFilter(item,check)).filter(item=>item)
}

// return array with the original objects who contains the checked key pairs values
const objectArrayContains=(arr, check = (key,value)=>true)=>{
    return arr.filter(item=>objectFilter(item,check))
}

// object testing
function check(key,value){
    return key.startsWith("a") 
}

console.log(objectFilter(testCase1,check)) 
// output: { a_1: 356, a_2: 348 }}

console.log(objectArrayContains(testCase2,check)) 
//output: [  { a_1: 356, x: 'something' }, { a_2: 348, x: 'something' }, { a_8: 787, x: 'something' }  ]

console.log(objectArrayFilter(testCase2,check))
// output: [ { a_1: 356 }, { a_2: 348 }, { a_8: 787 } ]

【讨论】:

    【解决方案2】:

    提供的方法通过查看对象/项目的第一个键来执行filter 数组...Object.keys(item)[0]...是否startWith OP 所需的字符'a'...

    console.log(
      [{
        a_1: 356
      }, {
        a_2: 348
      }, {
        b_1: 621
      }, {
        c_9: 311
      }, {
        b_8: 123
      }, {
        a_8: 787
    
      }].filter(item => Object.keys(item)[0].startsWith('a'))
    );
    .as-console-wrapper { min-height: 100%!important; top: 0; }

    【讨论】:

      【解决方案3】:

      我不确定您的问题是否已经解决。

      代码如下:

      let objects ={
      a_1: 356, 
      a_2: 348, 
      b_1: 621, 
      c_9: 311, 
      b_8: 123, 
      }
      console.log(Object.keys(objects).filter(check))
      // return a_1,a_2;
      function check(str){
         return str.startsWith("a") 
      }
      

      【讨论】:

      • 不,OP 确实声明... “我有一个对象数组...”
      猜你喜欢
      • 2010-09-25
      • 2019-05-29
      • 2015-06-21
      • 1970-01-01
      • 2019-08-22
      • 2020-04-21
      • 1970-01-01
      • 2021-10-30
      • 2020-01-27
      相关资源
      最近更新 更多