2

javascriptに次のJSONオブジェクト配列があります:

  [{ "AuthorName" : "Abc", "BookName" : "book-1" }]
  [{ "AuthorName" : "Abc", "BookName" : "book-2" }]
  [{ "AuthorName" : "Abc", "BookName" : "book-3" }]
  [{ "AuthorName" : "Abc", "BookName" : "book-4" }]

次に、上記のJSONオブジェクト配列から単一のJSONオブジェクトを作成します。新しく作成された単一のJSONオブジェクトにはAuthorName、とBooKName配列の2つのプロパティが含まれています。私はこのようなことを達成しようとしています:

{ "AuthorName" : "Abc", "Book" : ['book-1', 'book-2', 'book-3', 'book-4'] }

今私の質問は、JavaScriptで最小限のコードを書くことでこれを効率的に達成するにはどうすればよいですか?

4

5 に答える 5

2

うまくいけば、これは役に立ちます:

var bookSort = function (bookarray) {
    var i, 
        book,
        authorArray = [],
        il = bookarray.length,
        j,
        jl,
        authorInArray;
    for (i = 0; i < il; i++) {
        authorInArray= false;
        jl = authorArray.length;
        book = bookArray[i];
        for (j = 0; j < jl; j++) {
            if (book.AuthorName = authorArray[j].AuthorName) {
                authorInArray= true;
                authorArray[j].BookName.push(book.BookName);
                break;
            }
        }
        if (!authorInArray) {
            authorArray.push({AuthorName: book.AuthorName, BookName: [book.BookName]});
        }
    }
    return authorArray;
};
于 2012-10-22T19:36:25.707 に答える
2
var obj = {};
for(var i=0; i<myArray.length; i++) {
    if(obj[myArray[i].AuthorName] == null)
        obj[myArray[i].AuthorName] = [];
    obj[myArray[i].AuthorName].push(myArray[i].BookName)
}
于 2012-10-22T19:27:06.710 に答える
1

複数のオブジェクトを組み合わせる機能が必要なようです。

これを行う汎用関数を作成すると、それを再利用できます。authorArrayなどをハードコードしたソリューションを作成することはお勧めしません。

複数のオブジェクトを取り、それらを結合する関数を作成しましょう。シンプルに保ち、オブジェクトが質問のオブジェクトのように見えると仮定しましょう。つまり、結合するオブジェクトは、名前と値のペアの単純なリストになります。値は文字列または文字列の配列になります。

jsFiddle デモ

// A function that combines multiple object.
//   The original objects are made of name value pairs where the values are strings.
// If - for a key - the values are the same, the value is kept
// If - for a kye - the values are different, and array is created and the values pushed to it
//   after this all new values are added to the array if not already there.
var combineObjects = function() {

                 // see how many object are to be combined
    var length = arguments.length,
        i,
        // Create a new empty object that will be returned
        newObject = {},
        objectIn,
        prop,
        temp,
        ii,
        alreadyExists;

    // Go through all passed in object... combinging them
    for (i = 0; i < length; ++i) {

        objectIn = arguments[i];

        for (prop in objectIn) {
            if (objectIn.hasOwnProperty(prop)) {

                // Check if the prop exisits
                if (newObject[prop]) {

                     // Check if the prop is a single or multiple (array)
                    if (Object.prototype.toString.call( newObject[prop] ) === '[object Array]') {
                        // Multiple

                        // Check if element is in array
                        alreadyExists = false;
                        for (ii = 0; ii < newObject[prop].length; ++ii) {
                            if (newObject[prop][ii] === objectIn[prop]) {
                                alreadyExists = true;
                                break;                                    
                            }
                        }

                        if (! alreadyExists) {
                            newObject[prop].push(objectIn[prop]);
                        }

                    } else {
                        // Single   
                        if (newObject[prop] !== objectIn[prop]) {
                            temp = newObject[prop];
                            newObject[prop] = [temp, objectIn[prop]];                               
                        }
                    }
                } else {
                    newObject[prop] = objectIn[prop];
                }
            }
        }                
    }  

    // Alert for testing
    alert(JSON.stringify(newObject));

    return newObject;        
};
于 2012-10-22T20:07:56.573 に答える
0

あなたが何を求めているのかわからない。多分これはあなたのために働くでしょう:

var books = [ 
  [{ "AuthorName" : "Abc", "BookName" : "book-1" }],
  [{ "AuthorName" : "Abc", "BookName" : "book-2" }],
  [{ "AuthorName" : "Abc", "BookName" : "book-3" }],
  [{ "AuthorName" : "Abc", "BookName" : "book-4" }]
];    

// First book in the array
var first = books[0][0];

// Add BookName property to the first book object (BookNames would be a better name)
first.BookName = books.map(function(book, n) {
  return book[0].BookName;
});

/*
  Or, use jQuery.map if you got a older browser that don't support the Array.map function
  $.map(books, function(book, n) {
     return book[0].BookName;
  });
 */

// first is now:
{ AuthorName : "Abc", BookName : ['book-1', 'book-2', 'book-3', 'book-4'] }
于 2012-10-22T20:10:02.607 に答える
0

これらは、オブジェクトを含む 4 つの個別の配列のように見えます。

これらの 4 つの個別の配列を別の配列内に配置して、反復できるようにすると、次のようになります。

var a = [
        [{ AuthorName : 'Abc', BookName : 'book-1'}],
        [{ AuthorName : 'Abc', BookName : 'book-2'}],
        [{ AuthorName : 'Abc', BookName : 'book-3'}],
        [{ AuthorName : 'Abc', BookName : 'book-4'}]
        ];

私はただやります:

var new_array = [],
    temp_obj = {};

$.each(a, function(i,e) {
    var author = e[0].AuthorName,
        book   = e[0].BookName;
    temp_obj[author] ? temp_obj[author].push(book) : temp_obj[author] = [book];
});

$.each(temp_obj, function(author,books) {
    var obj = {AuthorName: author, BookName : books};
    new_array.push(obj);
});

//new_array is now = [{ AuthorName : 'Abc', BookName : ['book-1', 'book-2', 'book-3', 'book-4'] }]

フィドル

より多くの著者や本なども整理されますか?

証拠

于 2012-10-22T20:10:15.667 に答える