2014-06-05 2 views
0

У меня есть следующий объект:Как я могу отфильтровать массив объектов на основе значения поля и переназначить объекты?

options.getOrderBy = function (type) { 
    var OrderBy = [ 
     { type: 'x', id: 0, label: 'xx1', key: 'yy1' }, 
     { type: 'x', id: 1, label: 'xx2', key: [1,2] }, 
     { type: 'x', id: 9, label: 'xx2', key: ['a','b'] }, 
     { type: 'y', id: 0, label: 'xx44', key: 'yya' }, 
     { type: 'y', id: 1, label: 'xx45', key: 'yyb' }, 
     { type: 'y', id: 2, label: 'xx46', key: 'yyc' }, 
    ]; 
    return OrderBy; 
}; 

Что мне нужно, что когда функция вызывается с типом («х»), то я хочу, чтобы вернуть что-то вроде:

[ 
    { id: 0, label: 'xx1', key: [1.2] }, 
    { id: 1, label: 'xx2', key: 'yy2' }, 
    { id: 9, label: 'xx2', key: ['a','b'] } 
] 

Может ли кто-нибудь объяснить мне, как я могу фильтровать массив на основе значения поля типа, а затем просто вернуть массив объектов, содержащих идентификатор, метку и ключ?

Обратите внимание, что у меня есть _lodash, и я бы хотел использовать это, если это упростит. Кроме того, мое решение было бы для браузеров больше, чем IE9

ответ

0

Мое решение использует функции Lodash's map и omit. Посмотреть here

var filter = function(collection, filterKey) { 
    return _.map(collection, function(elem) { 
     return _.omit(elem, filterKey); 
    })   
} 

Используйте его как:

var filtered = filter(OrderBy, 'type'); 

EDIT: принимая во внимание и значение для filterKey

var filter = function(collection, filterKey, filterValue) { 
       return _.compact(_.map(collection, function(elem) { 
        if(elem[filterKey] === filterValue) 
         return _.omit(elem, filterKey); 
       }))   
       } 

Используйте его как:

var filtered = filter(OrderBy, 'type', 'x'); 

ВТОРОЙ EDIT: понятнее версия

var filterV2 = function(collection, filter) { 
    return _(collection) 
      .map(function (elem) { if(elem[filter.key] == filter.value) return _.omit(elem, filter.key) }) 
      .compact() 
      .value() 
} 

Используйте его как:

var filtered = filterV2(OrderBy, { key: 'type', value: 'x' }); 
+0

Как это проверить, чтобы вернуть только те элементы, чей тип element.type ==? Это не похоже на ответ на вопрос OP, только часть его! –

+0

Вы правы, я полностью пропустил эту часть. Я исправлю его как можно скорее. – link

+0

Я исправил ответ и предоставил две рабочие реализации. – link

0

Вы можете выбирать параметры заказа, как это:

var newOrderBy = []; 
for(var i = 0, l = OrderBy.length; i < l; i++) { 
    if(OrderBy[i].type == type) { 
    newOrderBy.push({ 
     id: OrderBy[i].id, 
     label: OrderBy[i].label, 
     key: OrderBy[i].key 
    }); 
    } 
} 
1
options.getOrderBy = function (type) { 
    var OrderBy = [ 
     { type: 'x', id: 0, label: 'xx1', key: 'yy1' }, 
     { type: 'x', id: 1, label: 'xx2', key: 'yy2' }, 
     { type: 'y', id: 0, label: 'xx44', key: 'yya' }, 
     { type: 'y', id: 1, label: 'xx45', key: 'yyb' }, 
     { type: 'y', id: 2, label: 'xx46', key: 'yyc' }, 
    ]; 
    return OrderBy.filter(function(e) { 
     return e.type === type; 
    }).map(function(e) { 
     delete e.type; 
     return e; 
    }); 
}; 

Если бы вы могли изменить OrderBy структуру на объект, он будет гораздо проще:

options.getOrderBy = function (type) { 
    var OrderBy = { 
     x:[ 
      { id: 0, label: 'xx1', key: 'yy1' }, 
      { id: 1, label: 'xx2', key: 'yy2' } 
     ], 
     y:[ 
      { id: 0, label: 'xx44', key: 'yya' }, 
      { id: 1, label: 'xx45', key: 'yyb' }, 
      { id: 2, label: 'xx46', key: 'yyc' } 
     ] 
    }; 
    return OrderBy[type]; 
}; 
+0

Ваше второе предложение кажется хорошим. Но как насчет того, был ли мой тип «abc». Я замечаю, что у вас нет кавычек вокруг x и y. –

0

Использование underscore.js _.filter(): -

options.getOrderBy = function (type) { 
var OrderBy = [ 
    { type: 'x', id: 0, label: 'xx1', key: 'yy1' }, 
    { type: 'x', id: 1, label: 'xx2', key: [1,2] }, 
    { type: 'x', id: 9, label: 'xx2', key: ['a','b'] }, 
    { type: 'y', id: 0, label: 'xx44', key: 'yya' }, 
    { type: 'y', id: 1, label: 'xx45', key: 'yyb' }, 
    { type: 'y', id: 2, label: 'xx46', key: 'yyc' }, 
]; 
var filteredOrderBy = _.filter(OrderBy, function (order) { 
    if (order.type === type) { 
     return true; 
    } else return false; 
}); 
return filteredOrderBy ; 

};

Смежные вопросы