Есть ли способ найти родственное значение свойства вложенного объекта?

#javascript #javascript-objects #object-properties

Вопрос:

Вот моя структура:

 var obj = {
  apple: {
     name: "Apple Juice",
     description: "",
  },
  orange: {
     name: "Orange Juice",
     description: "",
  }
}
 

Я хочу узнать описание apple или orange по его имени, не используя родителя ( obj.apple.description )

Есть ли что-то вроде obj.apple.name.siblingProperty того, чтобы получить ценность от description использования name ?

Комментарии:

1. Пожалуйста, расскажите подробнее о своей проблеме. Я не совсем понимаю, о чем вы просите.

2. Нет, потому что это было бы ненадежно. Порядок свойств соответствует указанным правилам, но вы ничего не можете с ними поделать, поэтому в зависимости от порядка код будет чрезвычайно хрупким.

3.Это поможет, если вы объясните, почему obj.apple.description это нежелательно.

4. Нет ничего подобного. Вы могли бы написать вспомогательную функцию для повторения свойств obj.apple , но любое решение будет хуже, чем просто выполнение obj.apple.description .

Ответ №1:

Вы можете просмотреть ключи объектов, найти индекс name в этом объекте, а затем получить следующий индекс, чтобы получить description :

 var obj = {
  apple: {
     name: "Apple Juice",
     description: "",
  },
  orange: {
     name: "Orange Juice",
     description: "",
  }
}

function getNextKey(object, key) {
  var keys = Object.keys(object);
  var keyIndex = keys.indexOf(key);
  var nextKey = keys[keyIndex   1];
  console.log(nextKey   ": "   object[nextKey]);
}

getNextKey(obj.apple, "name");
getNextKey(obj.orange, "name"); 

Ответ №2:

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

 const obj = {
    apple: {
        name: 'Apple Juice',
        description: 'apple selected',
    },
    orange: {
        name: 'Orange Juice',
        description: 'orange selected',
    },
};

const handler = {
    get: function (target, prop, receiver) {
        return target[prop].description;
    },
};

const proxy = new Proxy(obj, handler);

console.log(proxy.apple);
console.log(proxy.orange);