#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