Javascript 合并/过滤器数组



给定以下json对象:

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

如何获取包含每个"类别"属性值的单个数组,而不会重复?

在这种情况下,我想检索类似的东西

var objCategory = [1, 5, 6, 7];

在启用 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);

你必须遍历对象:

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);

类似

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

使用 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);

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);

经验:

这收集了所有类别

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]

最新更新