代码之家  ›  专栏  ›  技术社区  ›  cup_of

基于另一个数组的值获取键数组| JS

  •  2
  • cup_of  · 技术社区  · 6 年前

    假设我有一个如下所示的对象数组

    let myArray = [
      {item1: true},
      {item2: false},
      {item3: true},
      {item4: false}
    ]
    

    true 如下所示的值:

    let newArray = ['item1', 'item3']
    

    我找到了此函数,但它只返回单个项:

    function findKey(map, term) {
      var found = [];
      for(var property in map) {
        if(map.hasOwnProperty(property)) {
          for(var key in map[property]) {
            if(map[property].hasOwnProperty(key) && key === term) {
              found.push(property);
            }
          }
        }
      }
      return found;
    }
    
    5 回复  |  直到 4 年前
        1
  •  1
  •   Dacre Denny    6 年前

    您可以通过访问每个数组项的第一个键 Object.keys() ,并使用此选项筛选第一个键具有true值的项,然后通过调用来完成此过程 map()

    let myArray = [
      {item1: true},
      {item2: false},
      {item3: true},
      {item4: false}
    ]
    
    let result = myArray
    .filter(item => item[ Object.keys(item)[0] ] === true)
    .map(item => Object.keys(item)[0])
    
    console.log(result)
        2
  •  2
  •   junvar    6 年前

    假设 myArray 始终包含仅具有1个属性的对象。

    let newArray = myArray
        .map(item => Object.entries(item)[0])
        .filter(([key, value]) => value)
        .map(([key, value]) => key)
    
        3
  •  1
  •   Ele    6 年前

    使用函数 reduce 以生成所需的输出。函数的处理程序 将获得 keys 并检查每个 value === true

    这种方法检查对象中的整套关键点。此外,这种方法只使用一个循环。

    let myArray = [{item1: true},{item2: false},{item3: true},{item4: false}],
        result = myArray.reduce((a, c) => a.concat(Object.keys(c).filter(k => c[k] === true)), []);
        
    console.log(result);
        4
  •  1
  •   V. Sambor    6 年前

    const arr = [
      { item1: true },
      { item2: false },
      { item3: true },
      { item4: false }
    ]
    
    const result = [];
    const len = arr.length;
    
    for (let i = 0; i < len; ++i) {
      const obj = arr[i];
      const key = Object.keys(obj)[0];
    
      if(obj[key]) {
        result.push(key);
      }
    }
    
    console.log(result);
    

    数组上只有一个循环,而不是 map filter 最后循环两次。

        5
  •  1
  •   Kamil Kiełczewski    6 年前

    let newArray = myArray.map( x=>Object.keys(x)[0] ).filter( (k,i)=>myArray[i][k] ); 
    

    在上述解决方案中,我们首先使用: map 这与循环获取密钥数组(使用 Object.keys ) ["item1", "item2", "item3", "item4"] . 然后我们 filter 通过仅选择原始数组对象所具有的键来创建该数组 true myArray[0]["item1"] -> true (我们使用一个事实,即filter函数取数组元素(k)及其索引(i),这对于中的元素是相同的 myArray ). 在里面 map filter 我们使用 arrow functions .