Javascript合并/过滤数组

时间:2017-10-10 09:07:37

标签: javascript arrays properties

给出以下json对象:

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

如何获得包含每个“categories”属性值的单个数组,而不重复?

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

的内容

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

5 个答案:

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