получить ключ элемента в массиве, который находится внутри объекта

#javascript #arrays #loops #ecmascript-6 #javascript-objects

#javascript #массивы #циклы #ecmascript-6 #javascript-объекты

Вопрос:

У меня есть массив, который имеет ключ и внутри объекта. Пытаюсь получить ключ элемента, который находится внутри массива.

когда я ищу 4512, я должен получить ключ как eggs_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);
}
 

Комментарии:

1. Если значение поиска отображается в нескольких массивах, что должно быть возвращено? Первый ключ? Последний ключ? Все совпадения?

Ответ №1:

Держи, держи:

 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) 

Комментарии:

1. С этим связана одна проблема… Он будет продолжать перебирать ключи даже после того, как найдет совпадение. Это приведет к получению последнего ключа с совпадением. Если OP хочет первое, это проблема.

2. Это проблема только в том случае, если оператору действительно нужно первое вхождение. Поскольку этот вопрос является открытым, я не видел проблемы с возвратом последнего вхождения.

Ответ №2:

Вам нужно перебрать пары ключ / значение 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)) 

Ответ №3:

Использование Object.entries и find метод

 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)); 

Ответ №4:

Вы можете написать небольшую функцию, которая сделает это за вас. Эта функция соответствует первому времени нахождения кода.

 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 ) ); 

Обратите внимание, что вы перебираете an Object , а не an Array . Вы можете выполнить итерацию по объекту с for..of помощью или for..in . Я использовал for..in , потому что этот извлекает имя свойства по умолчанию.

Подробнее о for..in на MDN