Подтвердить что ты не робот

Функция Underscore.js _.map: пропустить значение

Я пытаюсь использовать функцию 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?

4b9b3361

Ответ 1

вы должны использовать _.filter() перед _.map()

var filteredArray = _.filter(myArray,function(obj) {
     return !obj.ignore;
});

var finalArray = _.map(filteredArray, function(obj) {
    return obj.myProperty;
});

Ответ 2

Вы можете использовать сокращение:

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;
}, []);

Ответ 3

Это можно сделать, используя только методы Underscore, стиль без точек:

var finalArray = _.chain(myArray)
    .reject('ignore')
    .pluck('myProperty')
    .value();

Ответ 4

.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');

Ответ 5

Попробуйте использовать lodash compact(). Он создает массив со всеми потерянными значениями. Таким образом, значения false, null, 0, "", undefined и NaN удаляются.

https://lodash.com/docs#compact

Я использую его - он очень чистый.

Ответ 6

Итак, это означает, что вы хотите отфильтровать, а затем сопоставить свой массив.

Чтобы сделать это с помощью underscore, вам нужно передать свой массив в этот конвейер:

myArray → фильтр карта → finalArray

var isIncluded = function(obj){
    return !obj.ignore
}
var takeProperty = function(obj){
    return obj.myProperty
}
var finalArray = _.map( _.filter(myArray, isIncluded), takeProperty  );

Ответ 7

Здесь другой путь. В этом используется функция компоновки в подчеркивании. Зачем сочинять? составление подкрепляется теорией категорий в математике. Этот способ также не содержит точек.

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]