2016-06-25 2 views
0

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

var fruits = [ 
    { type: "banana", number: 20 }, 
    { type: "apple", number: 2 }, 
    { type: "pineapple", number: 40 }, 
    { type: "pineapple", number: 32 }, 
    { type: "banana", number: 80 }, 
    { type: "pineapple", number: 24 }, 
    { type: "apple", number: 64 }, 
    { type: "apple", number: 12 } 
] 

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

// new array of bananas: 
[ 
    { type: "banana", number: 20 }, 
    { type: "banana", number: 80 } 
] 

// new array of apples: 
[ 
    { type: "apple", number: 2 }, 
    { type: "apple", number: 64 }, 
    { type: "apple", number: 12 } 
] 

// new array of pineapples: 
[ 
    { type: "pineapple", number: 40 }, 
    { type: "pineapple", number: 32 }, 
    { type: "pineapple", number: 24 } 
] 

ответ

1

Вы можете использовать Array.prototype.reduce(), Object.hasOwnProperty()

var res = fruits.reduce(function(obj, fruit) { 
    if (!obj.hasOwnProperty(fruit.type)) { 
    obj[fruit.type] = [fruit] 
    } else { 
    obj[fruit.type].push(fruit) 
    }; 
    return obj 
}, {}); 

console.log(res); 
1

Использование Array#filter

Метод filter() создает новый массив со всеми элементами, которые проходят тест, реализованный при условии function. (arr.filter(callback[, thisArg]))

Примечание: Вы можете создать обобщенные функции фильтрации согласно key.

var fruits = [{ 
 
    type: "banana", 
 
    number: 20 
 
}, { 
 
    type: "apple", 
 
    number: 2 
 
}, { 
 
    type: "pineapple", 
 
    number: 40 
 
}, { 
 
    type: "pineapple", 
 
    number: 32 
 
}, { 
 
    type: "banana", 
 
    number: 80 
 
}, { 
 
    type: "pineapple", 
 
    number: 24 
 
}, { 
 
    type: "apple", 
 
    number: 64 
 
}, { 
 
    type: "apple", 
 
    number: 12 
 
}]; 
 
var filter = function(arr, key) { 
 
    return arr.filter(function(item) { 
 
    return item.type === key; 
 
    }) 
 
} 
 
var apples = filter(fruits, 'apple'); 
 
var bananas = filter(fruits, 'banana'); 
 
var pineapples = filter(fruits, 'pineapple'); 
 
console.log(apples); 
 
console.log(bananas); 
 
console.log(pineapples);

1

Я думаю, что это группа по:

var fruits = [ 
 
    { type: "banana", number: 20 }, 
 
    { type: "apple", number: 2 }, 
 
    { type: "pineapple", number: 40 }, 
 
    { type: "pineapple", number: 32 }, 
 
    { type: "banana", number: 80 }, 
 
    { type: "pineapple", number: 24 }, 
 
    { type: "apple", number: 64 }, 
 
    { type: "apple", number: 12 } 
 
] 
 

 
var dict = {}; 
 
fruits.forEach(fruit => { 
 
    dict[fruit.type] = (dict[fruit.type] || []) 
 
    .concat([fruit]); 
 
}); 
 

 
var groups = Object.keys(dict).map(k => dict[k]); 
 

 
console.log(groups);

2

Вот мое решение, цикл по пунктам, поместить его в список с согласования ключа

var fruits = [ 
    { type: "banana", number: 20 }, 
    { type: "apple", number: 2 }, 
    { type: "pineapple", number: 40 }, 
    { type: "pineapple", number: 32 }, 
    { type: "banana", number: 80 }, 
    { type: "pineapple", number: 24 }, 
    { type: "apple", number: 64 }, 
    { type: "apple", number: 12 } 
]; 

var data = {}; 


fruits.forEach(function(fruit){ 
    if (data[fruit.type]) { 
    data[fruit.type].push(fruit); 
    } else { 
     data[fruit.type] = [fruit]; 
    } 
}); 

console.log(data); 
0

Еще один необычный способ сделать это с ES6;

var fruits = [ 
 
    { type: "banana", number: 20 }, 
 
    { type: "apple", number: 2 }, 
 
    { type: "pineapple", number: 40 }, 
 
    { type: "pineapple", number: 32 }, 
 
    { type: "banana", number: 80 }, 
 
    { type: "pineapple", number: 24 }, 
 
    { type: "apple", number: 64 }, 
 
    { type: "apple", number: 12 } 
 
], 
 
    grouped = [...fruits.reduce((p,c) => p.set(c.type, p.has(c.type) ? p.get(c.type).concat(c) 
 
                    : [c]), new Map()).values()]; 
 
console.log(grouped);

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