仅返回对象中的重复元素

问题描述 投票:0回答:2

我有一个“N”

Objects
的数组,我需要做的是恢复或仅保留那些
Objects
在同一个数组或另一个数组中,其中键
newField
的值与所有
Objects相同
Array
。注意:新的
Array
或最终的
Array
每个重复元素只能有一个对象。

注 2:我必须编辑它,因为返回值在所有对象中必须是通用的。例如,如果有 3/3 个对象具有相同的 newField 它将返回 1,如果 2/3 个对象具有相同的 newField 它不会返回任何内容

这就是我所拥有的,但其实什么都没有......

(这是 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;
  }
}

这是数组的示例:

 [[{"id":42,
    "idBucket":"patrimonial",
    "originalField":"c",
    "newField":"nCliente",
    "name":"Número Cliente",
    "description":"Número del Cliente",
    "filter":true,
    "visible":true,
    "idDataType":1},{"id":43,
    "idBucket":"patrimonial",
    "originalField":"ct",
    "newField":"nContrato",
    "name":"Número Contrato",
    "description":"Número de Contrato",
    "filter":true,
    "visible":true,
    "idDataType":1},{"id":45,
    "idBucket":"patrimonial",
    "originalField":"s",
    "newField":"sucursal",
    "name":"Sucursal",
    "description":"Sucursal",
    "filter":true,
    "visible":true,
    "idDataType":1
    },{"id":47,
    "idBucket":"patrimonial",
    "originalField":"sp",
    "newField":"sProducto",
    "name":"Subproducto",
    "description":"Subproducto",
    "filter":true,
    "visible":true,
    "idDataType":1
    }],
    [{
    "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
    }]]

在此示例中将不会返回任何内容,因为常见的

newField
值是“titulo”,但它仅在数组位置 1 和 2 中,而不是在 0 中,如果 newField 值“titulo”在所有 3 中,它将返回一个新数组只有一个 Object ,不关心 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
    }]]

在此示例中,它将返回一个

Object
,因为在所有 2 个对象中,它具有相同的
newField
值,不关心两者中的哪一个。尽管如果数组有 10 个对象,则所有 10 个
Objects
必须具有相同的
newField
值。请注意,如果可以超过 2 个
Objects
,则仅当所有
newFields
 中存在 2 个共同的 
Objects

值时才返回
javascript arrays loops object matrix
2个回答
0
投票

这是一种可能的方法:

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

0
投票

这是我的理解。 (我用你的阵列测试了它并给出了正确的结果):

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

代码片段:

var arr = [[{
        "id": 42,
        "idBucket": "patrimonial",
        "originalField": "c",
        "newField": "nCliente",
        "name": "Número Cliente",
        "description": "Número del Cliente",
        "filter": true,
        "visible": true,
        "idDataType": 1
    }, {
        "id": 43,
        "idBucket": "patrimonial",
        "originalField": "ct",
        "newField": "nContrato",
        "name": "Número Contrato",
        "description": "Número de Contrato",
        "filter": true,
        "visible": true,
        "idDataType": 1
    }, {
        "id": 45,
        "idBucket": "patrimonial",
        "originalField": "s",
        "newField": "sucursal",
        "name": "Sucursal",
        "description": "Sucursal",
        "filter": true,
        "visible": true,
        "idDataType": 1
    }, {
        "id": 47,
        "idBucket": "patrimonial",
        "originalField": "sp",
        "newField": "sProducto",
        "name": "Subproducto",
        "description": "Subproducto",
        "filter": true,
        "visible": true,
        "idDataType": 1
    }],
    [{
        "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
    }]];

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

console.log(result);

© www.soinside.com 2019 - 2024. All rights reserved.