0

Given the following array of objects:

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 }
]

How would you sort it by the type key, and dynamically create one new array of objects per type? To obtain something like this:

// 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 }
]

5 Answers 5

2

Here is my solution, loop through items, put it in a list with a matching 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 data = {};


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

console.log(data);
Sign up to request clarification or add additional context in comments.

Comments

1

You can use 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);

Comments

1

Use Array#filter

The filter() method creates a new array with all elements that pass the test implemented by the provided function.(arr.filter(callback[, thisArg]))

Note: You can create generalized functions to filter as per the 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);

Comments

1

I think this is a group by:

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

Comments

0

One other fancy way of doing this with 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);

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.