2017-10-10 175 views
-1

鑑於以下JSON對象:的Javascript合併/濾波器陣列

var posts = { 
    [0] : { 
     "name": "X", 
     "categories" : [1, 5, 6] 
    }, 
    [1] : { 
     "name": "Y", 
     "categories" : [1, 5, 7] 
    } 
} 

我怎樣才能得到一個包含每個「類別」屬性值的單個陣列,無需重複?

在這種情況下,我想檢索類似

變種objCategories = [1,5,6,7];

+0

請學習之間的差[對象(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer)和[陣列(HTTPS:/ /developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)。你對'posts'的定義很奇怪。 – str

+0

我投票結束這個問題作爲題外話,因爲問題顯示輸入和輸出格式,但沒有任何努力的跡象。這使得質疑一個要求,而不是一個問題陳述 – Rajesh

+0

你可以參考以下鏈接:** [基於屬性的組](https://stackoverflow.com/questions/31688459/group-array-items-using-object)* *和** [刪除數組中的重複項](https://stackoverflow.com/questions/9229645/remove-duplicates-from-javascript-array)**並玩弄(*合併*)以獲得最終解決方案。 – Rajesh

回答

0

var objCategories = {}; //create a map for all unique keys 
Object.keys(posts).forEach(function(index){ 
    var post = posts[ index ]; //get access to the object 
    post.categories.forEach(function(cat){ 
    objCategories[ cat ] = cat; 
    }); 
}); 
objCategories = Object.keys(objCategories); //get only the arrays of categories and assign them back to objCategories for desired result 
+0

這將導致'TypeError:posts.forEach不是一個函數',因爲它不是一個數組,它是一個對象。 – Svenskunganka

+0

'posts'似乎是'object'給我.. – Rayon

+0

@Svenskunganka現在再試 – gurvinder372

0

var posts = { 
 
    [0] : { 
 
     "name": "X", 
 
     "categories" : [1, 5, 6] 
 
    }, 
 
    [1] : { 
 
     "name": "Y", 
 
     "categories" : [1, 5, 7] 
 
    } 
 
} 
 

 
// logic 
 
var merged = []; // get all of the categories 
 
for (let name in posts) { // loop through name 
 
    var post = posts[name]; // get post 
 
    merged = merged.concat(post.categories); // add categories 
 
} 
 
var unique = merged.filter(function(item, pos, self) { // filter duplicates 
 
    return self.indexOf(item) == pos; 
 
}); 
 
console.log(unique);

EXP:

這將收集所有類別

for (let name in posts) { // loop through name 
    var post = posts[name]; // get post 
    merged = merged.concat(post.categories); // add categories 
} 

結果將是

[1, 5, 6, 1, 5, 7] 

那麼這將過濾掉重複:

var unique = merged.filter(function(item, pos, self) { // filter duplicates 
    return self.indexOf(item) == pos; 
}); 

結果是」

[1, 5, 6, 7] 
+0

*做*爲什麼?它會解決什麼? – Rajesh

+0

是什麼?它解決了這個問題 - 他要求找到所有獨特的類別 –

+0

我的觀點是關於你的解釋。 *做*沒有解釋什麼,爲什麼你在做你在做什麼。您正在爲讀者作答,而不僅僅是OP。 – Rajesh

0

您通過對象必須循環:

var posts = { 
 
    [0] : { 
 
     "name": "X", 
 
     "categories" : [1, 5, 6] 
 
    }, 
 
    [1] : { 
 
     "name": "Y", 
 
     "categories" : [1, 5, 7] 
 
    } 
 
} 
 
var objCategories = []; 
 

 
Object.values(posts).forEach(post => { 
 
    post.categories.forEach(c => { 
 
     if (objCategories.indexOf(c) === -1) { 
 
      objCategories.push(c); 
 
     } 
 
    }) 
 
}); 
 

 
console.log(objCategories);

1

在開啓了ES6的環境中,你可以使用一組和減少

let objCategories = [...new Set(Object.values(posts).reduce((a,b) => a.concat(b.categories), []))]; 

let posts = { 
 
    [0]: { 
 
    "name": "X", 
 
    "categories": [1, 5, 6] 
 
    }, 
 
    [1]: { 
 
    "name": "Y", 
 
    "categories": [1, 5, 7] 
 
    } 
 
}; 
 
let cats = [...new Set(Object.values(posts).reduce((a, b) => a.concat(b.categories), []))]; 
 
console.log(cats);

0

使用減少和foreach:

var posts = { 
 
    [0] : { 
 
     "name": "X", 
 
     "categories" : [1, 5, 6] 
 
    }, 
 
    [1] : { 
 
     "name": "Y", 
 
     "categories" : [1, 5, 7] 
 
    } 
 
}; 
 

 
var result = Object.keys(posts).reduce(function (categories, key) { 
 
    posts[key].categories.forEach(function (category) { 
 
    if (categories.indexOf(category) === -1) { 
 
     categories.push(category); 
 
    } 
 
    }); 
 
    return categories; 
 
}, []); 
 

 
console.log(result);