【问题标题】:get key of element in array which is inside object获取对象内部数组中元素的键
【发布时间】:2021-03-13 01:35:10
【问题描述】:

我有一个数组,它有一个键并且在一个对象内部。试图获取数组内元素的键。

当我搜索 4512 时,我应该将 key 作为 egg_code。

const items = {
  storeItems: {
    milk_code: [1212, 9898, 1214],
    vegetables_code: [2222, 75674, 8943, 3452],
    eggs_code: [4543, 4512, 1754, 9090]
  }
}
if (items.storeItems.includes(4512)) {
  const type = Object.keys(items(4512);
  console.log(type);
}

【问题讨论】:

  • 如果搜索值出现在多个数组中,应该返回什么?第一把钥匙?最后一把钥匙?所有匹配项?

标签: javascript arrays loops ecmascript-6 javascript-objects


【解决方案1】:

你可以写一个小函数来为你做这件事。该函数首次找到代码时匹配。

const items = {
  store_items: {
    milk_code: [1212, 9898, 1214],
    vegetables_code: [2222, 75674, 8943, 3452],
    eggs_code: [4543, 4512, 1754, 9090]
  }
}

function find_code( code, object ) {
  for( const property in object )
    if( object[property].includes(code) ) return property;
  
  return undefined;
}

console.log( find_code( 4512, items.store_items ) );
console.log( find_code( 1200, items.store_items ) );
console.log( find_code( 8943, items.store_items ) );

请注意,您正在迭代 Object,而不是 Array。您可以使用for..offor..in 迭代对象。我使用for..in,因为它默认提取属性名称。

Read more about for..in on MDN

【讨论】:

    【解决方案2】:

    使用Object.entriesfind方法

    const items = {
      storeItems: {
        milk_code: [1212, 9898, 1214],
        vegetables_code: [2222, 75674, 8943, 3452],
        eggs_code: [4543, 4512, 1754, 9090],
      },
    };
    
    const getKey = (obj, val) =>
      Object.entries(obj)
        .find(([key, arr]) => arr.includes(val))
        ?.shift();
        
        
    console.log(getKey(items.storeItems, 4512));

    【讨论】:

      【解决方案3】:

      需要迭代storeItems的键/值对,搜索值返回键

      const findKey = (obj, search) => {
        for (let [ key, val ] of Object.entries(obj)) {
          if (val.includes(search)) return key
        }
        return null
      }
      
      const items = {
        storeItems: {
          milk_code: [1212, 9898, 1214],
          vegetables_code: [2222, 75674, 8943, 3452],
          eggs_code: [4543, 4512, 1754, 9090]
        }
      }
      
      console.info(findKey(items.storeItems, 4512))

      这将返回找到(按定义顺序)具有匹配值的第一个键。


      如果值可以出现在多个值中,并且你想返回所有匹配,你可以使用一个简单的过滤器

      const findKeys = (obj, search) => {
        return Object.keys(obj).filter(key => obj[key].includes(search))
      }
      
      const items = {
        storeItems: {
          milk_code: [1212, 9898, 1214, 4512], // added 4512 here
          vegetables_code: [2222, 75674, 8943, 3452],
          eggs_code: [4543, 4512, 1754, 9090]
        }
      }
      
      console.info(findKeys(items.storeItems, 4512))

      【讨论】:

        【解决方案4】:

        来吧:

        const search_q = 4512;
        let k = null;
        
        const items = {
          storeItems: {
            milk_code: [1212, 9898, 1214],
            vegetables_code: [2222, 75674, 8943, 3452],
            eggs_code: [4543, 4512, 1754, 9090]
          }
        }
        
        Object.keys(items.storeItems).forEach(item => {
          if(items.storeItems[item].includes(search_q))
              k = item;
        })
        
        console.log(k)

        【讨论】:

        • 这个有一个问题......即使找到匹配项,它也会继续迭代键。这将导致最后一个键匹配。如果 OP 想要第一个,这是个问题。
        • 如果 OP 确实想要第一次出现,这只是一个问题。由于该问题是开放式的,因此我没有看到返回最后一次出现的问题。
        猜你喜欢
        • 2021-12-16
        • 2019-07-14
        • 2017-04-18
        • 2019-12-11
        • 1970-01-01
        • 2012-10-17
        • 1970-01-01
        • 2021-08-22
        • 1970-01-01
        相关资源
        最近更新 更多