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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.