给出以下json对象:
var posts = {
[0] : {
"name": "X",
"categories" : [1, 5, 6]
},
[1] : {
"name": "Y",
"categories" : [1, 5, 7]
}
}
如何获得包含每个“categories”属性值的单个数组,而不重复?
在这种情况下,我想检索类似
的内容var objCategories = [1,5,6,7];
答案 0 :(得分:1)
在启用ES6的环境中,您可以使用Set and reduce
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);

答案 1 :(得分: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
答案 2 :(得分:0)
DO
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]
答案 3 :(得分: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);

答案 4 :(得分:0)
使用reduce和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);