过滤一组对象 - 几个标准

时间:2016-08-25 08:29:54

标签: javascript arrays

我有一个对象数组,如下所示:

var data = [
        {
            name: "block",
            sameid: 500,
            parentid: 62
        },
        {
            name: "circle",
            sameid: 500,
            parentid: 62
        },
        {
            name: "cube",
            sameid: 500,
            parentid: 62
        }            
    ]

我需要对该数组进行过滤,以删除 sameid parentid 相同的对象。 但这是一个困扰我的麻烦...... 如果我得到这个对象数组:

 var data = [
        {
            name: "block",
            sameid: 500,
            parentid: 62
        },
        {
            name: "circle",
            sameid: 500,
            parentid: 62
        },
        {
            name: "cube",
            sameid: 500,
            parentid: 62
        },
        {
            name: "grain",
            sameid: 500,
            parentid: 63
        }
    ]

您可以看到名称 grain (最后一个)的对象,它有不同的parentid。如果是这种情况,则不应删除任何内容。

我正在打破这个问题。 我必须考虑的第一个标准是同一个。我应该按它分组。然后以某种方式检查父ID。

该数组可以包含许多不同的sameid和parentid的

更新: 在第一种情况下,数据有三个对象。所有人都应该被删除,因为他们都有相同的同一性和贫困性。

在第二种情况下,数据有四个对象,所有四个都应该保留,因为有一个不同的对象具有不同的parentid。

更新期望的结果:

 var filteredObjects = [];
     data = [
        {
            name: "block",
            sameid: 500,
            parentid: 62
        },
        {
            name: "circle",
            sameid: 500,
            parentid: 62
        },
        {
            name: "cube",
            sameid: 500,
            parentid: 62
        },
        {
            name: "grain",
            sameid: 500,
            parentid: 63
        }
    ]

在这种情况下,filteredObject将拥有所有值,因为有一个不同的parentid:

filteredObjects [{
        name: "block",
        sameid: 500,
        parentid: 62
    },
    {
        name: "circle",
        sameid: 500,
        parentid: 62
    },
    {
        name: "cube",
        sameid: 500,
        parentid: 62
    },
    {
        name: "grain",
        sameid: 500,
        parentid: 63
    }]

在这种情况下:

var filteredObjects = [];
     data = [
        {
            name: "block",
            sameid: 500,
            parentid: 62
        },
        {
            name: "circle",
            sameid: 500,
            parentid: 62
        },
        {
            name: "cube",
            sameid: 500,
            parentid: 62
        }            
    ]

filteredObject将没有值。数据数组也可以包含不同的sameid。

6 个答案:

答案 0 :(得分:3)

您可以使用sameidparentid构建树。然后过滤项目,只返回有两个或更多parenid的人。

function filter(array) {
    var hash = {};
    array.forEach(function (a) {
        hash[a.sameid] = hash[a.sameid] || {};
        hash[a.sameid][a.parentid] = true;
    });
    return array.filter(function (a) {
        return Object.keys(hash[a.sameid]).length > 1;
    });
}

var data0 = [{ name: "block", sameid: 500, parentid: 62 }],
    data1 = [{ name: "block", sameid: 500, parentid: 62 }, { name: "circle", sameid: 500, parentid: 62 }, { name: "cube", sameid: 500, parentid: 62 }],
    data2 = [{ name: "block", sameid: 500, parentid: 62 }, { name: "circle", sameid: 500, parentid: 62 }, { name: "cube", sameid: 500, parentid: 62 }, { name: "grain", sameid: 500, parentid: 63 }],
    data3 = [{ name: "block", sameid: 500, parentid: 62 }, { name: "circle", sameid: 500, parentid: 62 }, { name: "cube", sameid: 500, parentid: 62 }, { name: "grain", sameid: 500, parentid: 63 }, { name: "library", sameid: 600, parentid: 66 }, { name: "wood", sameid: 600, parentid: 66 }, { name: "water", sameid: 700, parentid: 77 }, { name: "fire", sameid: 700, parentid: 78 }, { name: "orphan", sameid: 300, parentid: 12 }];

console.log(filter(data0));
console.log(filter(data1));
console.log(filter(data2));
console.log(filter(data3));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:2)

您可以使用ES2015的Set结构来确定您是否有多种类型:

const parentIdSet = new Set(data.map(item => item.parentid));
console.log(parentIdSet.size); 
// If 1, you only have one parentId in the entire dataset.

Set是唯一值的集合。通过将所有父ID放入Set中,将删除所有重复值,并且只剩下唯一值。如果Set的大小为1,则表示整个数据集中只有一个parentid。

使用set意味着您可以避免将初始值存储在某处并尝试进行比较。 Set自动为您完成,并且具有更好的性能(可能)

答案 2 :(得分:2)

您可以简单地遍历初始数组并在检查唯一性的同时构建一个新数组 可以使用Array.prototype.filter

来完成



var data = [
  {
    name: "same sameid and parentid",
    sameid: 500,
    parentid: 62
  },
  {
    name: "same sameid and parentid",
    sameid: 500,
    parentid: 62
  },
  {
    name: "different sameid, same parentid",
    sameid: 501,
    parentid: 62
  },
  ,
  {
    name: "same sameid, different parentid",
    sameid: 500,
    parentid: 63
  }
];

var set = {};
var newData = data.filter(function(x) {
  var key = x.sameid + "_" + x.parentid;
  
  if (set[key]) 
    return false;
  
  return (set[key] = true);
});

console.log(newData);




请注意,此算法会使用相同ID的每次出现。如果需要,您可以实现其他逻辑。

答案 3 :(得分:0)

你可以试试这个

var distincts = []
for (var i = 0; i < data.length; i++)
    if (distincts.indexOf(data[i].sameid)==-1)
      distincts.push(data[i].sameid);

if(distincts.length==1){
    var distinctp = []
    for (var i = 0; i < data.length; i++)
        if (distinctp.indexOf(data[i].sameid)==-1)
           distinctp.push(data[i].sameid);
    if(distincts.length==1){
       data.splice(0,data.length)
    }
}

答案 4 :(得分:0)

我试图解决您的问题,您需要为以下代码添加下划线。

var data2 = [
    {
        name: "block",
        sameid: 500,
        parentid: 62
    },
    {
        name: "circle",
        sameid: 500,
        parentid: 62
    },
    {
        name: "cube",
        sameid: 500,
        parentid: 62
    },
    {
        name: "grain",
        sameid: 500,
        parentid: 63
    }
]

var backup = data2;
var count1 = 0; 
var count2 = 0;
for(var i = 0; i< data2.length ;i ++){
  for(var j = i+1;j<data2.length ;j++){
    if(data2[i].sameid == data2[j].sameid && data2[i].parentid == data2[j].parentid){
      count1++;
    }
    else if((data2[i].sameid == data2[j].sameid && data2[i].parentid != data2[j].parentid) ||(data2[i].sameid != data2[j].sameid && data2[i].parentid == data2[j].parentid) ){
      count2++;
    }

  }
  if(count2 == 0 && count1 != 0){
    backup = _.reject(backup,function(d){return d.sameid == data2[i].sameid && d.parentid == data2[i].parentid   })
  }
  count2=0;count1=0;

}


console.log(backup,"my new array")

答案 5 :(得分:0)

你也可以研究这种方法:

data.reduce(function(p, c, index){           
    if (p.length !== index) return [];                              

    if (p.length === 0) {
        return p.concat(c);
    }
    else if (p[0].sameid === c.sameid && p[0].parentid === c.parentid){                              
           return p.concat(c); 
     }           

      return [];
    }, []);