Сравнить значение внутри вложенного объекта - PullRequest
0 голосов
/ 06 октября 2018

Так что я некоторое время пытался найти решение этой проблемы, но безуспешно.

const nameTest = 'testName';
const test = {
   RANDOM_ONE: {
       NAME: 'testName',
       SOMETHING: {...}
   },
   RANDOM_TWO: {
       NAME: 'Name',
       SOMETHING: {...}
   }
}

Есть ли какой-нибудь простой и легкий способ сравнить nameTest и клавишу NAME беззная, что такое RANDOM_X для доступа к NAME?

Ответы [ 5 ]

0 голосов
/ 06 октября 2018

Вы можете использовать find .

Метод find выполняет функцию обратного вызова один раз для каждого индекса массива, пока не найдет метод, в котором callback возвращает истинное значение.Если такой элемент найден, find немедленно возвращает значение этого элемента.В противном случае функция find возвращает значение undefined.

Таким образом, это более эффективно с точки зрения памяти, чем циклический цикл по всему объекту с помощью forEach , поскольку функция find возвращает немедленно, если функция обратного вызова находит значение.Разорвать цикл forEach невозможно.В документации:

Нет способа остановить или прервать цикл forEach (), кроме как с помощью исключения.Если вам нужно такое поведение, метод forEach () является неправильным инструментом.

1.Если вы хотите получить весь объект

var nameTest = 'testName';
var test = {
   RANDOM_ONE: {
       NAME: 'testName',
       SOMETHING: {}
   },
   RANDOM_TWO: {
       NAME: 'Name',
       SOMETHING: {}
   }
};

function getObjectByNameProperty(object, property) {
    var objectKey = Object.keys(object)
        .find(key => object[key].NAME === property);
    return object[objectKey];
}

var object = getObjectByNameProperty(test, nameTest);
console.log(object);

2.Если вы просто хотите проверить, имеет ли объект заданное значение имени

var nameTest = 'testName';
var test = {
   RANDOM_ONE: {
       NAME: 'testName',
       SOMETHING: {}
   },
   RANDOM_TWO: {
       NAME: 'Name',
       SOMETHING: {}
   }
};

function doesObjectHaveGivenName(object, nameValue) {
    var objectKey = Object.keys(object)
        .find(key => object[key].NAME === nameValue);
    return objectKey ? true : false;
}

console.log( doesObjectHaveGivenName(test, nameTest) );
0 голосов
/ 06 октября 2018
var obj= test.filter(el){
    if(el.NAME==nameTest)
    {
        return el;
    }
 }
var x= obj!=null?true:false;
0 голосов
/ 06 октября 2018

Вы можете использовать Object.keys(), чтобы получить массив всех ключей.Затем выполните цикл по массиву, чтобы проверить свойство:

const nameTest = 'testName';
const test = {
   RANDOM_ONE: {
       NAME: 'testName',
       SOMETHING: {}
   },
   RANDOM_TWO: {
       NAME: 'Name',
       SOMETHING: {}
   }
}
let testKeys = Object.keys(test);
testKeys.forEach(function(k){
  console.log(test[k].NAME == nameTest);
});
0 голосов
/ 06 октября 2018

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

function compare(obj, text){
 for(let x in obj){
   if(obj.x.name == text) return true;
   else ;
 }
}

Затем вызовите функцию с вашим объектом и строкой.

let a = compare(test, nameTest);

Примечание: это позволит сравнить объект только субедитесь, что он содержит строку nameTest.

0 голосов
/ 06 октября 2018

Вы можете использовать цикл for ... in:

for (let key in test) {
  if (test[key].NAME === nameTest) {
    // do something
  }
}
...