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();