Используйте Lodash для получения значений объекта на основе истинного состояния другого объекта - PullRequest
0 голосов
/ 22 октября 2018

Я хочу использовать Lodash, чтобы получить метку для каждого животного с истинным значением.

Ожидаемый результат: ['DOG', 'CAT']

Есть ли способ сделать это без использования result.push?.

Как я могу заставить trueKeysLabel получить ярлык с животным от labelList?

var result = [],
  labelList = {
    dog: 'DOG',
    cat: 'CAT',
    monkey: 'MONKEY'
  },
  animalList = {
    dog: true,
    cat: true,
    monkey: false
  }
trueKeys = _.filter(_.keys(animalList), function(key) {
  return animalList[key];
});

_.forEach(trueKeys, function(key) {
  result.push(_.get(labelList, key));
});

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

Я пробовал _.get, но когда он используется в пределах _.forEach, trueKeysLabel равен ключам ['dog', 'cat'] вместо их значений.

var trueKeysLabel = _.forEach(trueKeys, function(key) {
    return _.get(labelList, key);
});

Ответы [ 4 ]

0 голосов
/ 22 октября 2018

Вам также не нужна другая библиотека для этого.Вы можете просто сделать Object.entries, затем filter и, наконец, map, чтобы получить значения:

var labelList = { dog: 'DOG', cat: 'CAT', monkey: 'MONKEY' }, animalList = { dog: true, cat: true, monkey: false }

const r = Object.entries(labelList).filter(x => animalList[x[0]]).map(x => x[1])

console.log(r)
0 голосов
/ 22 октября 2018

Использовать _.values ​​()

_.forEach(trueKeys, function(key) {
      result.push(_.values(labelList[key]));
});
0 голосов
/ 22 октября 2018

Используйте _.filter() для получения значений из labelList, что значение их ключа равно true in animalList:

var labelList = {
    dog: 'DOG',
    cat: 'CAT',
    monkey: 'MONKEY'
  },
  animalList = {
    dog: true,
    cat: true,
    monkey: false
  };

var result = _.filter(labelList, (v, k) => animalList[k]); 

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 22 октября 2018

Я уверен, что есть несколько способов сделать это, но ниже приводится то, что вы просили, используя _. PickBy , _. Identity , _.keys , _. filter и _. включает в себя .

var result = [],
  labelList = {
    dog: 'DOG',
    cat: 'CAT',
    monkey: 'MONKEY'
  },
  animalList = {
    dog: true,
    cat: true,
    monkey: false
  };

// pickBy will return an object of "truthy" values.
// keys then creates an array of the resultant object keys - ["dog", "cat"]
var keys = _.keys(_.pickBy(animalList, _.identity));

// filter will return only those values the predicate function returns truthy for
results = _.filter(labelList, function(val, key) {
  // return true if the key is in the list of "truthy" keys
  return (_.includes(keys, key));
});

console.log(results);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
...