Search code examples
javascriptlodashecmascript-5

Chained lodash v3 functions returning object contents rather than key


I have a var absurdPersonalities which returns Object {aipAggressive: Object, aipAir: Object, aipBot: Object, aipCautious: Object, aipDefender: Object…} These objects each contain something that looks like:

adv_eco_mod: 1.3
adv_eco_mod_alone: 0.85
basic_to_advanced_factory_ratio: 0
display_name: "!LOC:Absurd"
enable_commander_danger_responses: true
energy_demand_check: 0.8
energy_drain_check: 0.65
fabber_alone_on_planet_mod: 2
fabber_to_factory_ratio_advanced: 1
fabber_to_factory_ratio_basic: 1
factory_alone_on_planet_mod: 0.5
factory_build_delay_min: 0
go_for_the_kill: true
max_advanced_fabbers: 50
max_basic_fabbers: 20
metal_demand_check: 0.71
metal_drain_check: 0.54
micro_type: 2
min_advanced_fabbers: 3
min_basic_fabbers: 2
name: "Absurd"
neural_data_mod: 1
per_expansion_delay: 0
percent_air: 0.2
percent_bot: 0.25
percent_naval: 0.05
percent_orbital: 0.05
percent_vehicle: 0.45
personality_tags: Array[2]
priority_scout_metal_spots: true
starting_location_evaluation_radius: 400
unable_to_expand_delay: 0

Currently my code is as follows:

_.sample(_.keys(_.omit(absurdPersonalities, "aipRandom")))

This returns a random key as a string from the object, such as "aipAir"

But when I chain the code

_.chain(absurdPersonalities).sample().keys().omit("aipRandom").value()

It returns:

Object {0: "display_name", 1: "percent_vehicle", 2: "percent_bot", 3: "percent_air", 4: "percent_naval", 5: "percent_orbital", 6: "personality_tags", 7: "metal_drain_check", 8: "energy_drain_check", 9: "metal_demand_check", 10: "energy_demand_check", 11: "micro_type", 12: "go_for_the_kill", 13: "priority_scout_metal_spots", 14: "enable_commander_danger_responses", 15: "neural_data_mod", 16: "unable_to_expand_delay", 17: "per_expansion_delay", 18: "factory_build_delay_min", 19: "adv_eco_mod", 20: "adv_eco_mod_alone", 21: "fabber_to_factory_ratio_basic", 22: "fabber_to_factory_ratio_advanced", 23: "fabber_alone_on_planet_mod", 24: "basic_to_advanced_factory_ratio", 25: "factory_alone_on_planet_mod", 26: "min_basic_fabbers", 27: "max_basic_fabbers", 28: "min_advanced_fabbers", 29: "max_advanced_fabbers", 30: "starting_location_evaluation_radius", 31: "name", 32: "percent_land"}

I'm unclear on where I've gone wrong in chaining this, or whether this is simply something that cannot be chained.


Solution

  • Your first (working) expression first performs omit, then keys and finally sample. Note how that expression is resolved from the inside out.

    When you chain, you must keep the same order:

    _.chain(absurdPersonalities).omit("aipRandom").keys().sample().value()