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

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;}}

Но я не уверен, как копнуть поглубже, а можно ли вообще?

0
Christopher Long 13 Мар 2018 в 22:47

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>
1
CRice 13 Мар 2018 в 20:04

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

_.chain(SimpleWeapons)
  .omit('properties')
  .sample()
  .get('Name', '') // The extra '' is in case the .Name property is undefined.
  .value();
1
th3n3wguy 14 Мар 2018 в 01:21