Ответ 1
вы должны использовать _.filter() перед _.map()
var filteredArray = _.filter(myArray,function(obj) {
return !obj.ignore;
});
var finalArray = _.map(filteredArray, function(obj) {
return obj.myProperty;
});
Я пытаюсь использовать функцию underscore.js _.map
для массива объектов, чтобы получить массив с свойством каждого объекта. Это обычный сценарий, поэтому:
var finalArray = _.map(myArray, function(obj) {
return obj.myProperty;
});
Но в некоторых случаях мне нужно, чтобы в массиве ничего не добавлялось. Это может быть что-то вроде:
var finalArray = _.map(myArray, function(obj) {
if (!obj.ignore) {
return obj.myProperty;
}
});
Результатом этого является то, что в массив вводится значение undefined
, которое не то же самое, что ничего не толкает.
Есть ли способ, чтобы функция карты не нажимала значение, или мне нужно выполнить пост-обработку моего finalArray
, чтобы удалить ненужные undefined
?
вы должны использовать _.filter() перед _.map()
var filteredArray = _.filter(myArray,function(obj) {
return !obj.ignore;
});
var finalArray = _.map(filteredArray, function(obj) {
return obj.myProperty;
});
Вы можете использовать сокращение:
myArray.reduce(function (acc, obj) {
if (!obj.ignore) {
acc.push(obj.myProperty);
}
return acc;
}, []);
или с lodash:
_.reduce(myArray, function (acc, obj) {
if (!obj.ignore) {
acc.push(obj.myProperty);
}
return acc;
}, []);
Это можно сделать, используя только методы Underscore, стиль без точек:
var finalArray = _.chain(myArray)
.reject('ignore')
.pluck('myProperty')
.value();
.map
отобразит новое значение в массиве, вы можете использовать .filter
для фильтрации массива. FYI вы можете использовать .pluck
для сопоставления свойства с объектом:
_.chain(myArray).filter(function(obj) { return !obj.ignore; }).pluck('myProperty').value();
Вы также можете использовать .where
следующим образом:
_.chain(myArray).where({ignore: false}).pluck('myProperty').value();
Или:
_.pluck(_.where(myArray, {ignore: false}), 'myProperty');
Попробуйте использовать lodash compact()
. Он создает массив со всеми потерянными значениями. Таким образом, значения false
, null
, 0
, ""
, undefined
и NaN
удаляются.
https://lodash.com/docs#compact
Я использую его - он очень чистый.
Итак, это означает, что вы хотите отфильтровать, а затем сопоставить свой массив.
Чтобы сделать это с помощью underscore
, вам нужно передать свой массив в этот конвейер:
myArray → фильтр → карта → finalArray
var isIncluded = function(obj){
return !obj.ignore
}
var takeProperty = function(obj){
return obj.myProperty
}
var finalArray = _.map( _.filter(myArray, isIncluded), takeProperty );
Здесь другой путь. В этом используется функция компоновки в подчеркивании. Зачем сочинять? составление подкрепляется теорией категорий в математике. Этот способ также не содержит точек.
var pluckMyProp = function(array) {
return _.pluck(array, 'myProperty')
}
var reject = function(array) {
return _.reject(array, function(element) {
return element['ignore'] === true
})
}
var finalArray = _.compose(pluckMyProp, reject)
var data = [{myProperty: 1, ignore: false}, {ignore: true}, {myProperty: 2}]
finalArray(data) //=> [1,2]