筛选匹配所有对象键的数组。获取具有唯一对象的新数组

时间:2017-03-27 11:57:27

标签: javascript arrays

我想基于包含对象的现有数组获得2个新数组。 (每个对象的键保持不变)

newArray1对象的值应该是唯一的。换句话说:

[ 
   {Layer:"Layer",LayerName:"foo",LayerWidth:200,LayerHeight:400},
   {Layer:"Layer",LayerName:"FOOBAR",LayerWidth:200,LayerHeight:400},       
   {Layer:"Layer",LayerName:"foo",LayerWidth:200,LayerHeight:400}
]
  • newArray1应该包含第1个和第2个对象,因为3rd具有与第1个对象相同的对象值。

  • newArray2应该包含所有其他对象,这些对象不在newArray1中,(仅限第三个对象)



arr = []

for(var i=0;i<allSymbols.length;i++){
    var obj={
      Layer: allSymbols(i),
      LayerName: allSymbols(i).name(),
      LayerWidth: allSymbols(i).width(),
      LayerHeight: allSymbols(i).height()
    }
    arr.push(obj)
}


// filter so far... 
for(var u=0;u<arr.length;u++){
    var filter = arr[u];
    arr = arr.filter(function(item){
     for(var key in filter){
       if(item[key] == filter[key]){
        return true
       }
     }
       return false
    });
}

// output newArray1(arr)?
// output newArray2?
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

逻辑

  • 获取每个对象的过滤列表。
  • 获取第一个匹配对象的索引。
  • 如果筛选列表的长度为1,则对象是唯一的,应该推送到唯一列表。
  • 如果没有,如果index等于当前索引,则这是第一次出现,并且应再次推送到唯一列表。
  • 对于所有剩余的对象,它们是重复的,并且是第二次或第n次重复,应该被推送到重复列表

&#13;
&#13;
var d = [{Layer:"Layer",LayerName:"foo",LayerWidth:200,LayerHeight:400},{Layer:"Layer",LayerName:"FOOBAR",LayerWidth:200,LayerHeight:400},{Layer:"Layer",LayerName:"foo",LayerWidth:200,LayerHeight:400}]

var dupes = [];
var unique = [];

d.forEach(function(c,i,a){
  var objStr = JSON.stringify(c);
  
  var index = a.findIndex(function(o){
    return JSON.stringify(o) === objStr;
  });
  
  var _filter = a.filter(function(o){
    return JSON.stringify(o) === objStr;
  });
  if(_filter.length === 1 || index === i){
    unique.push(c)
  } 
  else{
    dupes.push(c);
  }
}, []);

console.log(dupes, unique)
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您可以检查重复的对象并过滤给定的数据。

&#13;
&#13;
var data = [{ Layer: "Layer", LayerName: "foo", LayerWidth: 200, LayerHeight: 400 }, { Layer: "Layer", LayerName: "FOOBAR", LayerWidth: 200, LayerHeight: 400 }, { Layer: "Layer", LayerName: "foo", LayerWidth: 200, LayerHeight: 400 }],
    array1 = [],
    array2 = data.filter(function (a) {
        return array1.some(function (b) {
            return Object.keys(a).length === Object.keys(b).length && Object.keys(a).every(function (k) {
                return a[k] === b[k];
            });
        }) || array1.push(a) && false;
    });

console.log(array1);
console.log(array2);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

相关问题