Javascript 仅返回对象中重复的元素

Javascript 仅返回对象中重复的元素,javascript,arrays,loops,object,matrix,Javascript,Arrays,Loops,Object,Matrix,我有一个“N”objet数组,我需要做的是只恢复或保留那些objet在同一个数组中,或者在另一个数组中,其中键newField的值与数组的所有对象相同。注意:新的数组或最终的数组每个重复元素只能有一个对象。 注2:我必须编辑它,因为它的返回值必须在所有对象中都是公共的。例如,如果有三分之三的对象具有相同的新字段,它将返回一个,如果有两分之三的对象具有相同的新字段,它将不会返回任何内容 这就是我所拥有的,但其实什么都不是/ (这是来自Angular 2的过滤器) 我将感谢你的任何帮助 多谢各位

我有一个“N”
objet
数组,我需要做的是只恢复或保留那些
objet
在同一个数组中,或者在另一个数组中,其中键
newField
的值与
数组的所有
对象
相同。注意:新的
数组
或最终的
数组
每个重复元素只能有一个对象。 注2:我必须编辑它,因为它的返回值必须在所有对象中都是公共的。例如,如果有三分之三的对象具有相同的新字段,它将返回一个,如果有两分之三的对象具有相同的新字段,它将不会返回任何内容

这就是我所拥有的,但其实什么都不是/

(这是来自Angular 2的过滤器) 我将感谢你的任何帮助

多谢各位

    export class BucketPipe implements PipeTransform {
  public arr = []
  transform(value: any, args?: any): any {
    return this.seleccion(value);
  }

  seleccion(value)  {
    console.log("val: " +JSON.stringify(value))
    var newValue = new Array()
      for(var i = 0; i < value.length; i++) {
        for(var y = 0; y < value[i].length; y++)  {
          if(value[i][y])  {
            var val = value[i][y]
            do {
              newValue.push(value[i][y])
              val = value[i][y]
            } while (value[i][y].newField !== val.newField)
          }
        }
      }
      return this.filter(newValue)
  }

  filter(values)  {
    var field: string[] = new Array()
    for(var i = 0; i < values.length; i++)  {
      Object.keys(values[i]).map((obj,key)  =>  {
        if(values[i].newField == values[i][obj]) field.push(values[i])
        })
    }
    this.arr = field
    var result = [];
      this.arr.forEach((subArr, index) => {
        if(this.validate(subArr, index))
          result.push(subArr);
    });

    console.log("Result: ",result)
  }

  validate(subArr, index) {
      var test = true;
      for(var i = 0; i < subArr.length && test; i++){
          var obj = subArr[i];
          var subtest = false;
          for(var j = 0; j < this.arr.length && !subtest; j++){
              if(index == j) continue;
              var found = this.arr[j].find(function(e){
                  return e["newField"] == obj["newField"];
              });
              if(found) subtest = true;
          }
          test = test && subtest;
      }
      return test;
  }
}
在本例中,将不返回任何内容,因为公共
newField
值为“titulo”,但它仅位于数组位置1和2,而不在0中。如果newField值“titulo”位于所有3中,则它将返回一个仅包含一个对象的新数组,而不关心3中的哪一个

另一个例子

 [[{
    "id":11,
    "idBucket":"expunic",
    "originalField":"nc",
    "newField":"nCliente",
    "name":"Número Cliente",
    "description":"Número del Cliente",
    "filter":true,
    "visible":true,
    "idDataType":1
    },{
    "id":12,
    "idBucket":"expunic",
    "originalField":"t",
    "newField":"titulo",
    "name":"Título Aplicación",
    "description":"Título de la Aplicación o Gaveta",
    "filter":true,
    "visible":true,
    "idDataType":1
    }],
    [{
    "id":16,
    "idBucket":"bastanteo",
    "originalField":"t",
    "newField":"titulo",
    "name":"Título Aplicación",
    "description":"Nombre de la Gaveta",
    "filter":true,
    "visible":true,
    "idDataType":1
    }]]

在本例中,它将返回一个
对象
,因为在所有两个对象中,它对
新字段
具有相同的值,而不关心两者中的哪一个。尽管如果数组在所有10个
对象中有10个对象,则
必须与
新字段的值相同。注意:if可以是2个以上的
对象
仅当所有
对象中有2个
新字段
值时才返回

function getFirstObjectForEachRepeatedKey(values, keyName)
{
  if (!keyName)
    keyName = "newField";

  var haveSeenKey = {};
  var alreadySelectedValue = {};
  var result = [];

  for (var i = 0; i < values.length; i++)
  {
    var key = values[i][keyName];

    if (!(key in haveSeenKey))
      haveSeenKey[key] = values[i];
    else
    {
      var selectedValue = haveSeenKey[key];

      if (selectedValue !== alreadySelectedValue)
      {
        result.push(selectedValue);
        haveSeenKey[key] = alreadySelectedValue;
      }
    }
  }

  return result;
}
函数getFirstObjectForEachRepeatedKey(值、键名)
{
如果(!keyName)
keyName=“newField”;
var haveSeenKey={};
var alreadySelectedValue={};
var结果=[];
对于(变量i=0;i
这里有一种可能的方法:

function getFirstObjectForEachRepeatedKey(values, keyName)
{
  if (!keyName)
    keyName = "newField";

  var haveSeenKey = {};
  var alreadySelectedValue = {};
  var result = [];

  for (var i = 0; i < values.length; i++)
  {
    var key = values[i][keyName];

    if (!(key in haveSeenKey))
      haveSeenKey[key] = values[i];
    else
    {
      var selectedValue = haveSeenKey[key];

      if (selectedValue !== alreadySelectedValue)
      {
        result.push(selectedValue);
        haveSeenKey[key] = alreadySelectedValue;
      }
    }
  }

  return result;
}
函数getFirstObjectForEachRepeatedKey(值、键名)
{
如果(!keyName)
keyName=“newField”;
var haveSeenKey={};
var alreadySelectedValue={};
var结果=[];
对于(变量i=0;i
这就是我的理解。(我用您的阵列对其进行了测试,并给出了正确的结果):

//在此处定义数组(必须命名为arr,否则可以相应地修改代码
var arr=[{}、{}、{}、{}、{}、{}、{}、{}]];/。。。
功能验证(子任务,索引){
var检验=真;
对于(变量i=0;i
代码片段:

var-arr=[[{
“id”:42,
“Ibucket”:“传统的”,
“originalField”:“c”,
“newField”:“nCliente”,
“名称”:“Número客户”,
“描述”:“Número del Cliente”,
“过滤器”:正确,
“可见”:真实,
“idDataType”:1
}, {
“id”:43,
“Ibucket”:“传统的”,
“原始字段”:“ct”,
“newField”:“nContrato”,
“姓名”:“Número contato”,
“描述”:“Número de Contrato”,
“过滤器”:正确,
“可见”:真实,
“idDataType”:1
}, {
“id”:45,
“Ibucket”:“传统的”,
“originalField”:“s”,
“newField”:“sucursal”,
“名称”:“Sucursal”,
“描述”:“Sucursal”,
“过滤器”:正确,
“可见”:真实,
“idDataType”:1
}, {
“id”:47,
“Ibucket”:“传统的”,
“原始字段”:“sp”,
“newField”:“sProducto”,
“名称”:“子管道”,
“说明”:“子管道”,
“过滤器”:正确,
“可见”:真实,
“idDataType”:1
}],
[{
“id”:11,
“idBucket”:“expunic”,
“原始字段”:“nc”,
“newField”:“nCliente”,
“名称”:“Número客户”,
“描述”:“Número del Cliente”,
“过滤器”:正确,
“可见”:真实,
“idDataType”:1
}, {
“id”:12,
“idBucket”:“expunic”,
“originalField”:“t”,
“newField”:“titulo”,
“名称”:“Título Aplicación”,
“描述”:“Título de la Aplicación o Gaveta”,
“过滤器”:正确,
“可见”:真实,
“idDataType”:1
}],
[{
“id”:16,
“Ibucket”:“bastanteo”,
“originalField”:“t”,
“newField”:“titulo”,
“名称”:“Título Aplicación”,
“描述”:“Nombre de la Gaveta”,
“过滤器”:正确,
“可见”:真实,
“idDataType”:1
}]];
功能验证(子任务,索引){
var检验=真;
对于(变量i=0;i// define your array here (must be named arr or you can modify the code accordingly
var arr = [[{}, {}, {}], [{}], [{}, {}]]; // ...

function validate(subArr, index){
    var test = true;
    for(var i = 0; i < subArr.length && test; i++){
        var obj = subArr[i];
        var subtest = false;
        for(var j = 0; j < arr.length && !subtest; j++){
            if(index == j) continue;
            var found = arr[j].find(function(e){
                return e["newField"] == obj["newField"];
            });
            if(found) subtest = true;
        }
        test = test && subtest;
    }
    return test;
}

var result = [];
arr.forEach(function(subArr, index){
    if(validate(subArr, index))
        result.push(subArr);
});