Получить ключ от объекта стоимости - PullRequest
1 голос
/ 04 марта 2020

Я пытаюсь получить ключ от значения объекта. У меня есть следующий массив:

["Test 91", "Test 92", "Demo 1", "Demo 2"]

И у меня есть один объект:

{
    D123_EMG: {
        value: "Test 91", 
        isArchived: true
    }
    D21: {
        value: "Test 92", 
        isArchived: false
    }
    Z6200_EMO: {
        value: "Demo 1", 
        isArchived: true
    }
    G211_GTH: {
        value: "Demo 2", 
        isArchived: false
    }
}

Так как я могу получить ключ как D123_EMG, если значение равно Test 91?

Я попробовал это, но не получил правильного ответа

    var data = Object.keys(objectData);
    var keys = []
    for(var i = 0; i < array.length; i++){
        for(var j = 0; j < data.length; j++){
            if(array[i] === objectData[data[j].value) {
                keys.push(objectData[data[j])
            }
        }
    }

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

Ответы [ 4 ]

2 голосов
/ 04 марта 2020

Вы можете использовать filter() следующим образом:

const values = ["Test 91", "Test 92", "Demo 1", "Demo 2"];

const data = {
    D123_EMG: {
        value: "Test 91", 
        isArchived: true
    },
    D21: {
        value: "Test 92", 
        isArchived: false
    },
    Z6200_EMO: {
        value: "Demo 1", 
        isArchived: true
    },
    G211_GTH: {
        value: "Demo 2", 
        isArchived: false
    }
}

const keysFound = Object.keys(data).filter(key => values.includes(data[key].value));

console.log(keysFound); // ["D123_EMG", "D21", "Z6200_EMO", "G211_GTH"];
0 голосов
/ 04 марта 2020

Если вы столкнулись с этой проблемой в хранилище управления состояниями, это признак того, что хранилище не разработано должным образом. Без дополнительной информации я не могу порекомендовать улучшения относительно того, как изменить свое состояние.

Итак, если вы не измените свое состояние, вы можете подумать о создании карты по значению, например:

const byValue = Object.keys(data).reduce((accumulator, currentKey) => {
  const currentObject = data[currentKey];
  currentObject.key = currentKey;
  accumulator[currentObject.value] = currentObject;
  return accumulator;
}, {});

Это создает карту, которая выглядит следующим образом:

{
  "Test 91": { "value": "Test 91", "isArchived": true, "key": "D123_EMG" },
  "Test 92": { "value": "Test 92", "isArchived": false, "key": "D21" },
  "Demo 1": { "value": "Demo 1", "isArchived": true, "key": "Z6200_EMO" },
  "Demo 2": { "value": "Demo 2", "isArchived": false, "key": "G211_GTH" }
}

При этом вы используете значение в качестве ключа поиска:

const test91 = byValue["Test 91"]
...
0 голосов
/ 04 марта 2020

Мне нравится использовать .reduce(), который в этом случае также работает. Прочитайте из документации MDN:

Метод redu () выполняет функцию редуктора (которую вы предоставляете) для каждого элемента массива, в результате чего получается одно выходное значение.

И вы можете объединить его с Object.entries(), где документация гласит:

Метод Object.entries () возвращает массив собственных перечислимых строковых ключей данного объекта пары property [key, value], в том же порядке, в котором они указаны в for ... в l oop. (Единственное важное отличие состоит в том, что for ... in l oop также перечисляет свойства в цепочке прототипов).

Посмотрите, что я сделал из рабочего решения:

const data = { D123_EMG: { value: "Test 91", isArchived: true }, D21: { value: "Test 92", isArchived: false }, Z6200_EMO: { value: "Demo 1", isArchived: true }, G211_GTH: { value: "Demo 2", isArchived: false } };
const filterValue = 'Test 91';

const entries = Object.entries(data);
const result = entries.reduce((a, c) => c[1].value === filterValue ? c[0] : a, '');

console.log(result);

Надеюсь, это поможет!

0 голосов
/ 04 марта 2020

Это не имеет отношения к реакции. У кого-то еще может быть более чистое решение, но вот то, которое сработает, если я правильно понимаю ваш вопрос:

let data = {
    D123_EMG: {
        value: "Test 91", 
        isArchived: true
    },
    D21: {
        value: "Test 92", 
        isArchived: false
    },
    Z6200_EMO: {
        value: "Demo 1", 
        isArchived: true
    },
    G211_GTH: {
        value: "Demo 2", 
        isArchived: false
    }
}

let name = '';
Object.entries(data).forEach((v) => {
  // if the object value matches, set the name variable to the key
  if (v[1].value == 'Test 91') {
    name = v[0];
  }
})


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