javascript - 仅返回对象中的重复元素

标签 javascript arrays loops object matrix

我有一个“N”数组Objets ,我需要做的是恢复或只保留那些 Objets在同一个数组或另一个数组中,其中键的值 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 value 是“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 个 Objet Objects必须相同newField值(value)。注意是否可以大于2 Objects仅当有 2 newFields 时才返回所有共同的值(value)观Objects

最佳答案

这是一种可能的方法:

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

关于javascript - 仅返回对象中的重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41753230/

相关文章:

javascript - Vue 中的去抖计算属性/getter

javascript - React.cloneElement : pass new children or copy props. child ?

php - 显示后从MYSQL中删除PHP数据

java - 循环我的列表,以便遍历并组合整个列表

javascript - 如何在 JS 中将矩形设置为对象进行数组?

javascript - 将 ng-click 与 data-ng-href 结合使用

php - 给定值的索引替换多维数组中的值

javascript - 如何使用保存数组名称的变量将对象文字添加到数组

java - 在循环内创建多个列表

java - 从字符串数组中获取所有可能的名称组合?