【问题标题】:Javascript Merge/filter arrayJavascript合并/过滤数组
【发布时间】:2017-10-10 09:07:36
【问题描述】:

给定以下 json 对象:

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

如何获得一个包含每个“类别”属性值且不重复的数组?

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

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

【问题讨论】:

  • 请了解objectsarrays的区别。你对posts的定义很奇怪。
  • 我投票结束这个问题,因为这个问题显示了输入和输出格式,但没有任何努力的迹象。这使得问题成为要求,而不是问题陈述
  • 您可以参考以下链接:Group based on propertyRemove duplicates from array 并玩转(合并)到得到最终解决方案。

标签: javascript arrays properties


【解决方案1】:

在启用 ES6 的环境中,您可以使用 Set 和 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);

【讨论】:

    【解决方案2】:

    你必须遍历对象:

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

    【讨论】:

      【解决方案3】:

      类似

      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
      

      【讨论】:

      • 这将导致TypeError: posts.forEach is not a function,因为它不是一个数组,而是一个对象。
      • @Svenskunganka 现在再试一次
      • @Rayon 是的,我的错
      • 请补充说明。 类似的东西不会帮助任何人
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        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]
        

        【讨论】:

        • 什么?它解决了这个问题 - 他要求找到所有独特的类别
        • 我的意思是关于你的解释。 do 没有解释你在做什么以及为什么要做你正在做的事情。您是在为读者回答,而不仅仅是 OP。
        猜你喜欢
        • 2017-09-10
        • 2019-05-29
        • 2023-03-15
        • 1970-01-01
        • 2021-01-15
        • 2020-05-17
        • 2019-01-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多