Как я могу получить «имя» путем поиска «значение» / ключ? - PullRequest
0 голосов
/ 04 февраля 2019

Я не могу получить строку «ola» из «label» при поиске «value» 174.

В похожем вопросе я нашел фрагмент кода, похожий на тот, что у меня есть: Как получить ключ в объекте JavaScript по его значению? .Я попробовал, но он вернулся неопределенным.С тех пор я менял его, чтобы попытаться что-то вернуть.Прямо сейчас, поскольку оно возвращает логическое значение (false).

a = {
    list: {0: {label: 'ola', value: 174}}
};
value = 174;

console.log([Object.values(a.list).includes(value)]);

Я хотел бы вернуть только строку «ola», выполнив поиск «значения», которое оно имеет, в данном случае это 174И я хотел бы сохранить структуру Объекта "а" как есть.

Ответы [ 6 ]

0 голосов
/ 04 февраля 2019

Первая функция возвращает строку метки.
Вторая функция возвращает массив со всеми совпадающими метками.

function findLabelByValue(value){ // Returns first matching label found
    return Object.values(a.list).find(element => element.value == value).label;
}

function findLabelsByValue(value){ // Returns all matching labels as array
    return Object.values(a.list).reduce(function(list, element){
        if(element.value == value)
            return list.push(element.label);
        return list;
    }, []);
}

Используется:
Object.values ​​() , Array.find () , Array.reduce ()

0 голосов
/ 04 февраля 2019

Array.prototype.includes () не будет работать с объектами.Если возможно, я бы перевернул ключ и значение, имеет смысл искать ключ, а не значение, потому что вы не можете иметь дублирующие ключи в объекте.

Однако из фрагмента кода кажется, что вы хотели, чтобы «список» был массивом, а не объектом.

Вот правильный json:

a = {
    list: [
        {label: 'ola', value: 174}
    ]
}
0 голосов
/ 04 февраля 2019

Вам необходимо найти ключ В списке.

var a = {
  list : {
    0 : {
      label: 'ola',
      value: 174
    }
  }
},
value = 174;

console.log(findKey(a.list, value, 'label', 'value'));

function findKey(obj, value, labelField, valueField) {
  var foundKey = Object.keys(obj).find(x => obj[x][valueField] === value);
  return foundKey != null ? obj[foundKey][labelField] : null;
}
.as-console-wrapper { top: 0; max-height: 100% !important; }
0 голосов
/ 04 февраля 2019

Как было сказано ранее, но список не является Array, возможно, что-то подобное поможет вам достичь того, чего вы хотите?

const a = {
  list: {
      0: {
        label: 'ola', 
        value: 174
      }
  }
};
const value = 174;

function find(obj, val) {
  let res = null;
  Object.keys(a.list).forEach((k) => {
    if (a.list[k].value === val) {
      res = a.list[k].label;
    }
  });
  return res;
}

console.log(find(a, value));
0 голосов
/ 04 февраля 2019

a.list - это объект, используйте for in для перебора его значений.

a = {
    list: {0: {label: 'ola', value: 174}}
};
value = 174;

for (const key in a.list) {
    if (a.list.hasOwnProperty(key)) {
        const element = a.list[key];
        console.log(element.value === value)
    }
}
0 голосов
/ 04 февраля 2019

Использование значений объектов # и Array # find и destructuring .

Array # find вернет undefined, если значение, которое выИщите не существует.Используйте оператор || для обработки этого конкретного случая, прежде чем получить доступ к свойству label того, что было найдено.

const a = {
    list: {0: {label: 'ola', value: 174}}
};
const value = 174;

function find(v){
  return (Object.values(a.list).find(({value})=>value===v)||{}).label;
}

const res = find(value);

console.log(res);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...