Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/479.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何根据出现在许多地方的另一个属性对一个JSON属性进行分组?_Javascript_Jquery - Fatal编程技术网

Javascript 如何根据出现在许多地方的另一个属性对一个JSON属性进行分组?

Javascript 如何根据出现在许多地方的另一个属性对一个JSON属性进行分组?,javascript,jquery,Javascript,Jquery,我有一个JSON: 现在我想制作一个输出作者和标题的表格。如果作者相同,则标题将合并在一起。例如,“乔治·欧威尔”的标题是“1984,动物农场,欧姆”,“柏拉图”的标题是“道歉,亚里士多德”,等等。我如何使用jQuery或vanilla JavaScript实现它 应该从以下内容开始: var books = [ { author: "George Owell", title: "1984", price: 0, page: 328}, { author: "Jane Aus

我有一个JSON:


现在我想制作一个输出作者和标题的表格。如果作者相同,则标题将合并在一起。例如,“乔治·欧威尔”的标题是“1984,动物农场,欧姆”,“柏拉图”的标题是“道歉,亚里士多德”,等等。我如何使用jQuery或vanilla JavaScript实现它

应该从以下内容开始:

var books = [

    { author: "George Owell", title: "1984", price: 0, page: 328}, 
    { author: "Jane Austen", title: "Pride And Prejudice", price: 20, page: 279}, 
    { author: "J.K. Rowling", title: "Harry Potter and the Sorcerer's Stone", price: 23, page: 320}, 
    { author: "Plato", title: "Apology", price: 0, page: 127}, 
    { author: "Sigmund Freud", title: "The Interpretation of Dreams"},
    { author: "George Owell", title: "Animal Farm", price: 0, page: 100}, 
    { author: "George Owell", title: "Omh", price: 0, page: 100}, 
    { author: "Plato", title: "Aristotle", price: 0, page: 227}
    ];


   var authorBooks = {}

   books.forEach(function(book) {

      if(!authorBooks[book.author]) {
        authorBooks[book.author] = [];
      }

      authorBooks[book.author].push({title: book.title, price: book.price, page: book.page});

    },{});

昨天python中也出现了同样的问题。以下是我的答案:

以下是一个js版本:

var map = {}
for(var i = 0; i < books.length; i++) {
    var book = books[i];
    if(!(book.author in map)) {
        map[book.author] = []
    }
    map[book.author].push(book.title)
}

var out = []
for(var author in map) {
    out.push({
        author: author,
        books: map[author].join(", ")
    })
}
var-map={}
for(var i=0;i
您可以试试

var books = [

{ author: "George Owell", title: "1984", price: 0, page: 328}, 
{ author: "Jane Austen", title: "Pride And Prejudice", price: 20, page: 279}, 
{ author: "J.K. Rowling", title: "Harry Potter and the Sorcerer's Stone", price: 23, page: 320}, 
{ author: "Plato", title: "Apology", price: 0, page: 127}, 
{ author: "Sigmund Freud", title: "The Interpretation of Dreams"},
{ author: "George Owell", title: "Animal Farm", price: 0, page: 100}, 
{ author: "George Owell", title: "Omh", price: 0, page: 100}, 
{ author: "Plato", title: "Aristotle", price: 0, page: 227}
];

var results = books.reduce((previous, book) => {
(previous[book.author] = previous[book.author] || []).push(book);
    return previous;
}, []);

console.log(results);
var书籍=[
{作者:“乔治·欧威尔”,标题:“1984”,价格:0,第328页},
{作者:“简·奥斯汀”,标题:“傲慢与偏见”,价格:20,第279页},
{作者:“J.K.罗琳”,标题:“哈利波特与魔法石”,价格:23,第320页},
{作者:“柏拉图”,标题:“道歉”,价格:0,页码:127},
{作者:“西格蒙德·弗洛伊德”,标题:“梦的解释”},
{作者:“乔治·欧威尔”,标题:“动物农场”,价格:0,页码:100},
{作者:“George Owell”,标题:“Omh”,价格:0,页码:100},
{作者:“柏拉图”,标题:“亚里士多德”,价格:0,第227页}
];
var uniqueauthors=[];
$.each(书籍、函数(索引、值){
if($.inArray(value.author,uniqueauthors)<0)
{
uniqueauthors.push(value.author);
}
});
$.each(唯一作者、函数(索引、值){
var bok=$.map(账簿、函数(val、索引){
返回值(val.author==value)?val.title:null;
});
var$tr=$('').append(''+value+'').append(''+bok.join('',''+'');
$('table')。追加($tr);
});
td{
边框:1px纯黑;
}

作者
标题

您的问题中没有JSON:您有一个对象数组。无论如何,我可能会使用array
.reduce()
方法来实现这一点。您是在询问如何生成HTML输出以显示结果,还是仅仅询问如何合并标题?合并部分可以(或多或少)以与这个问题相同的方式完成:我可以非常快速地编写代码来完成,如果你不关心“价格”或“页面”-这些是“书籍”,所以想要创建一个名为“作者”的新对象,那么我想这是有意义的。。。但我认为你可能试图以错误的方式解决另一个问题。
var books = [

{ author: "George Owell", title: "1984", price: 0, page: 328}, 
{ author: "Jane Austen", title: "Pride And Prejudice", price: 20, page: 279}, 
{ author: "J.K. Rowling", title: "Harry Potter and the Sorcerer's Stone", price: 23, page: 320}, 
{ author: "Plato", title: "Apology", price: 0, page: 127}, 
{ author: "Sigmund Freud", title: "The Interpretation of Dreams"},
{ author: "George Owell", title: "Animal Farm", price: 0, page: 100}, 
{ author: "George Owell", title: "Omh", price: 0, page: 100}, 
{ author: "Plato", title: "Aristotle", price: 0, page: 227}
];

var results = books.reduce((previous, book) => {
(previous[book.author] = previous[book.author] || []).push(book);
    return previous;
}, []);

console.log(results);