Получить значение заданного ключа объекта внутри массива объектов

#javascript

#javascript

Вопрос:

Я хочу выбрать значение заданного ключа, и я сделал это, используя уродливый код: (я использовал два цикла for для выполнения простой задачи)

 const phrases = [
 {0: "i was sent", 1: "have you ever"},
 {2: "look", 3: "looked", 4: "looked", 5: "at", 6: "at"},
 {7: "someone", 8: "somebody", 9: "to earth", 10: "sam"},
 {11: "to protect"},
 {12: "us", 13: "to earth"},
 {14: "us", 15: "you"} 
];

const result = getSpanIDText(8); // get value of 8 im the above array
console.log(result);

function getSpanIDText(spanID) {

  for (let i = 0; i < phrases.length; i  ) {
    const set = phrases[i]; // each object inside phrases array
    for (const [key, value] of Object.entries(set)) {
      if (parseInt(key) === spanID) {
        return value;
      }
    }

  }
}  

Интересно, есть ли более понятный код, не требующий двух циклов for для достижения одного и того же результата?

Ответ №1:

Это устранило бы вложенный цикл for, что немного упростило бы чтение.

 function getSpanIDText(spanID) {
     
     for(let phrase of phrases) {
      
        if(phrase[spanID]) {
           return phrase[spanID];
        }
      }
     }
  

Ответ №2:

Я думаю, вы могли бы сделать что-то подобное, при условии, что вы уверены, что каждый объект будет содержать уникальные цифровые ключи.

 let item = phrases.map(obj => Object.entries(obj)).flat().filter(arr => arr[0] == spanId);
return item.length ? item[0][1] : false;
  

Дает

 getSpanIDText(8); //"somebody"
  

Ответ №3:

Я не знаю, действительно ли это лучше, но следующее также должно работать

 function getSpanId(phrases, spanId) {
  return new Map(phrases.map(Object.entries).flat()).get(spanId)
}
  

Ответ №4:

Попробуйте это.

 const phrases = [

 {0: "i was sent", 1: "have you ever"},
 {2: "look", 3: "looked", 4: "looked", 5: "at", 6: "at"},
 {7: "someone", 8: "somebody", 9: "to earth", 10: "sam"},
 {11: "to protect"},
 {12: "us", 13: "to earth"},
 {14: "us", 15: "you"}
 
];
const result = getSpanIDText(8);

function getSpanIDText(id) {
  let output
  phrases.forEach(x => {
    return Object.keys(x).forEach(y => {
      if ( y === id) {
        output = x[y];
      }
    });
  });
  return output;
}
console.log(result);  

Ответ №5:

Вы могли бы использовать оптимизированную reduce функцию.

Когда reduce функция находит соответствующий ключ, она изменяет дублированный массив, чтобы выйти из reduce цикла.

 const phrases = [
  {0: "i was sent", 1: "have you ever"},
  {2: "look", 3: "looked", 4: "looked", 5: "at", 6: "at"},
  {7: "someone", 8: "somebody", 9: "to earth", 10: "sam"},
  {11: "to protect"},
  {12: "us", 13: "to earth"},
  {14: "us", 15: "you"}
];

function getSpan(phrases, key) {
  return phrases.slice(0).reduce((acc, cv, i, arr) => {
    if (key in cv) {
      arr = [];
      return cv[key];
    }
    return acc
  }, undefined)
}

console.log(getSpan(phrases, 8)) // "somebody"
console.log(getSpan(phrases, 22)) // undefined