Lodash ._sample с вложенными объектами

У меня есть объект с вложенными объектами, как это:

var SimpleWeapons = {

    properties: "SimpleWeapons",

  Club:{Name:"Club", Cost:"1sp", Damage:"1d4 bludgeoning", Weight:"2lb", Properties:"Light"},
  Dagger:{Name:"Dagger" , Cost:"    2 gp" , Damage: "1d4 piercing", Weight:"1lb" , Properties:"Finesse, light, thrown (range 20/60)"},
  Greatclub:{Name:"Greatclub" , Cost:"2sp" , Damage: "1d8 bludgeoning   ", Weight:"10 lb" , Properties:"Two-handed"},
  Handaxe:{Name:"Handaxe" , Cost:"5gp" , Damage: "1d6 slashing", Weight:"2lb" , Properties:"Light, thrown (range 20/60)"},
  Javelin:{Name:"Javelin" , Cost:"5sp" , Damage: "1d6 piercing", Weight:"2lb" , Properties:"Thrown (range 30/120)"},
  LightHammer:{Name:"Light Hammer" , Cost:"2gp" , Damage: "1d4 bludgeoning", Weight:"2lb" , Properties:"Light, thrown (range 20/60)"},
  Mace:{Name:"Mace" , Cost:"5gp" , Damage: "1d6 bludgeoning", Weight:"4lb" , Properties:""},
  Quarterstaff:{Name:"Quarterstaff" , Cost:"2sp" , Damage: "1d6 bludgeoning", Weight:"4lb" , Properties:"Versatile (1d8)"},
  Sickle:{Name:"Sickle" , Cost:"1gp" , Damage: "1d4 slashing", Weight:"2lb" , Properties:"Light"},
  Spear:{Name:"Spear" , Cost:"1gp" , Damage: "1d6 piercing", Weight:"3lb" , Properties:"Thrown (range 20/60), versatile (1d8)"}

}

Я хотел бы вернуть одно из свойств вложенного объекта (как в виде строки) в произвольном порядке, поэтому "Клуб" или "Кинжал" с помощью функции. я использовал _.sample а также _.sampleSize в более плоских объектах в этом проекте следующим образом:

var getDefaultEquipment = (chaClass) => {
    if(chaClass === "Bard"){
        var equipment = {};
        equipment.equipment = (_.sampleSize(classes.Bard.equipment,1));
        return equipment;}}

но я не уверен, как копать немного глубже, или даже если это возможно?

2 ответа

Решение

Если вы хотите только один результат, используйте _.sample чтобы получить один случайный предмет. Я бы также использовал _.omit чтобы убедиться, что вы не тянете properties ключ, который не является действительным оружием.

Как только у вас есть случайный объект из _.sample Вы можете получить его имя обычным способом, используя точечную запись: .Name,

Пример:

var SimpleWeapons = {

  properties: "SimpleWeapons",

  Club: {
    Name: "Club",
    Cost: "1sp",
    Damage: "1d4 bludgeoning",
    Weight: "2lb",
    Properties: "Light"
  },
  Dagger: {
    Name: "Dagger",
    Cost: "    2 gp",
    Damage: "1d4 piercing",
    Weight: "1lb",
    Properties: "Finesse, light, thrown (range 20/60)"
  },
  Greatclub: {
    Name: "Greatclub",
    Cost: "2sp",
    Damage: "1d8 bludgeoning   ",
    Weight: "10 lb",
    Properties: "Two-handed"
  },
  Handaxe: {
    Name: "Handaxe",
    Cost: "5gp",
    Damage: "1d6 slashing",
    Weight: "2lb",
    Properties: "Light, thrown (range 20/60)"
  },
  Javelin: {
    Name: "Javelin",
    Cost: "5sp",
    Damage: "1d6 piercing",
    Weight: "2lb",
    Properties: "Thrown (range 30/120)"
  },
  LightHammer: {
    Name: "Light Hammer",
    Cost: "2gp",
    Damage: "1d4 bludgeoning",
    Weight: "2lb",
    Properties: "Light, thrown (range 20/60)"
  },
  Mace: {
    Name: "Mace",
    Cost: "5gp",
    Damage: "1d6 bludgeoning",
    Weight: "4lb",
    Properties: ""
  },
  Quarterstaff: {
    Name: "Quarterstaff",
    Cost: "2sp",
    Damage: "1d6 bludgeoning",
    Weight: "4lb",
    Properties: "Versatile (1d8)"
  },
  Sickle: {
    Name: "Sickle",
    Cost: "1gp",
    Damage: "1d4 slashing",
    Weight: "2lb",
    Properties: "Light"
  },
  Spear: {
    Name: "Spear",
    Cost: "1gp",
    Damage: "1d6 piercing",
    Weight: "3lb",
    Properties: "Thrown (range 20/60), versatile (1d8)"
  }
}

const randomWeapon = _.sample(_.omit(SimpleWeapons, "properties")).Name;
console.log("A random weapon:", randomWeapon);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.5/lodash.min.js"></script>

Я знаю, что уже есть принятый ответ, но я хотел также показать, как вы можете сделать это с _.chain() метод также:

_.chain(SimpleWeapons)
  .omit('properties')
  .sample()
  .get('Name', '') // The extra '' is in case the .Name property is undefined.
  .value();
Другие вопросы по тегам