olo
olo

Reputation: 5271

javascript split array depends on names

I have a mybooks array, I'd like to separate it by the book's category.

var mybooks = [
    ['novel','BookName1','$20.00'],
    ['novel','BookName2','$24.00'],
    ['novel','BookName3','$34.00'],
    ['novel','BookName4','$31.00'],
    ['novel','BookName4','$38.00'],
    ['Biograph','BookName5','$28.00'],
    ['Biograph','BookName6','$48.00'],
    ['Biograph','BookName7','$50.00']
  ];

I made it this way.

 for(i=0; i<mybooks.length; i++){
        if ((mybooks[i][0]) == 'novel'){
        var books = mybooks[i];
        console.log(books);
       }
      };

console.log(books) prints

["novel", "BookName1", "$20.00"] 
["novel", "BookName2", "$24.00"]
["novel", "BookName3", "$34.00"]
["novel", "BookName4", "$31.00"] 
["novel", "BookName4", "$38.00"] 

How can I make a global variable called 'splited' equals books

Upvotes: 0

Views: 94

Answers (6)

Alex Ma
Alex Ma

Reputation: 73

This should arrange your book array by its type:

var mybooks = [
    ['novel','BookName1','$20.00'],
    ['novel','BookName2','$24.00'],
    ['novel','BookName3','$34.00'],
    ['novel','BookName4','$31.00'],
    ['novel','BookName4','$38.00'],
    ['Biograph','BookName5','$28.00'],
    ['Biograph','BookName6','$48.00'],
    ['Biograph','BookName7','$50.00']
  ];

var library = {}

for(i=0; i<mybooks.length; i++){
    var bookType = mybooks[i][0];
    if (typeof library[bookType]=='undefined')  
       library[bookType] = [];
    library[bookType].push(mybooks[i]);
}

console.log(library);

Upvotes: 0

Scott Sauyet
Scott Sauyet

Reputation: 50797

A fairly simple approach is:

var splitted = mybooks.filter(function(book) {return book[0] == 'novel';});

You could generalize it like this:

var byType = function(type) {return function(book) {return book[0] == type;};};
var bios = mybooks.filter(byType('Biograph'));

Upvotes: 1

plalx
plalx

Reputation: 43718

Well, I am not sure exactly what you want as end result, but you could do something like this:

var splitted = mybooks.reduce(function (result, book) {
    var cat = book[0];

    if (!result[cat]) {
        result[cat] = [book];
    } else {
        result[cat].push(book);
    }

    return result;
}, {});

console.log(splitted); //all books splitted by categories
console.log(splitted.novel); //array of novels
console.log(splitted.Biograph); //array of Biograph

If you simply want to gather one category at a time, you could also use the filter function.

var novels = mybooks.filter(function (book) {
    return book[0] === 'novel';
});

Upvotes: 1

Dr.Molle
Dr.Molle

Reputation: 117334

var splitted=$.grep(mybooks,function(o){return (o[0]=='novel');});

Upvotes: 1

Michael Benin
Michael Benin

Reputation: 4332

Make a function return books:

var makeBooks = function(mybooks, type){
  var books=[];
  for(var i=0; i<mybooks.length; i++){
      if ((mybooks[i][0]) === type){
        books.push(mybooks[i]);
      }
  };
  return books;
}

window.splitted = makeBooks(mybooks, 'novel');

Upvotes: 2

theatlasroom
theatlasroom

Reputation: 1184

Are you trying to split the array by the book category? If so, it might be good to have a look at object literals instead

Upvotes: 0

Related Questions