如何在javascript中合并多个对象?

如何在javascript中合并多个对象?,javascript,jquery,Javascript,Jquery,我在javascript中有以下JSON对象数组: [{ "AuthorName" : "Abc", "BookName" : "book-1" }] [{ "AuthorName" : "Abc", "BookName" : "book-2" }] [{ "AuthorName" : "Abc", "BookName" : "book-3" }] [{ "AuthorName" : "Abc", "BookName" : "book-4" }] 现在我想从上面的JSON对象数

我在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
数组。我正在努力实现这样的目标:

{ "AuthorName" : "Abc", "Book" : ['book-1', 'book-2', 'book-3', 'book-4'] }
现在我的问题是,我怎样才能高效地实现这一点,并且用javascript编写最少的代码?

var obj={};
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)
}

对于(var i=0;i,希望这将有助于:

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;
};
var bookSort=函数(bookarray){
var i,
书,
authorary=[],
il=bookarray.length,
J
jl,
作者雷;
对于(i=0;i
似乎您需要一个组合多个对象的函数

如果你创建了一个通用函数来实现这一点,你可以重用它。我不鼓励你创建一个像
authorary
等硬编码的解决方案

让我们创建一个函数,该函数接受多个对象并将它们组合起来。让我们保持简单,并假设这些对象看起来像您问题中的对象。换句话说,要组合的对象将只是一个名称-值对的平面列表。值将是一个字符串或字符串数组

//组合多个对象的函数。
//原始对象由名称-值对组成,其中值是字符串。
//如果-对于键-值相同,则保留该值
//如果-对于kye-值不同,则创建数组并将值推送到该数组
//在此之后,所有新值都将添加到数组中(如果还没有)。
var combineObjects=函数(){
//查看要组合的对象数
var length=arguments.length,
我
//创建将返回的新空对象
newObject={},
反对党,
道具
临时雇员
二,,
已经存在的;
//检查所有传入的对象…合并它们
对于(i=0;i
不确定你想要什么。也许这对你有用:

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

看起来这些只是四个包含对象的独立数组

如果将这四个独立的数组放在另一个数组中,以便可以对它们进行迭代,如下所示:

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

它也会整理出更多的作家和书籍等


这些都不是JSON。都是JavaScript,迭代和压缩数据的代码也是如此。也就是说,你应该澄清你现有的数据结构是什么。你在第一个代码块中显示的既不是JSON,也不是可执行的JS。为什么要从这么多的元素数组开始?这是非常浪费的。没有
“JSON对象”
.JSON是数据的字符串表示形式。它恰好与JavaScript对象语法相似。您的起始对象实际上是什么样子的?您尝试过什么?一种简单的方法就是循环并比较
AuthorName
s。您的第一个代码块是四个完全独立的语句,声明四个完全独立的语句单独的一个元素JavaScript数组。它不是JSON。这不会生成所需格式的数组。@Rocket Hazmat-在我看来,他想要的是一个对象而不是数组,但他使用的语法是将所有内容都放在方括号中。我不知道他想要什么,但希望这能将他推向正确的方向:-)
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'] }]