【问题标题】:Return only repeated elements from an object仅返回对象中的重复元素
【发布时间】:2017-01-19 22:55:53
【问题描述】:

我有一个“N”数组Objets,我需要做的是恢复或仅将那些Objets 保留在同一数组或另一个数组中,其中键newField 的值与所有数组相同Array 中的Objects。注意:新的Array 或最终的Array 每个重复元素只能有一个对象。 注意 2:我必须编辑它,因为它的返回值必须在所有对象中都是通用的。例如,如果有 3/3 个对象具有相同的 newField,它将返回一个,如果 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 值。请注意,只有当所有 Objects 共有 2 个 newFields 值时,才能返回超过 2 个 Objects

【问题讨论】:

  • 发布一个数组结构示例以及该示例的预期结果。
  • 我刚刚用数组 @ibrahimmahrir 的例子编辑了帖子,我想要一个新的对象数组,只有当 newField 在所有原始对象中重复时
  • 因此,在本例中,新数组将仅包含 ID 为 12 和 16 的对象。对吧?
  • 不,因为 12 和 16 是“titulo”,但“titulo”仅位于数组位置 1 和 2,而不是 0 @ibrahimmahrir 此示例不返回任何内容,但如果“titulo”在所有3 个对象将只返回一个新数组中的一个对象。 :)
  • 这个数组的结果是什么。发布所需的输出(无需发布所有内容,只需包含 ID 的数组即可)。如果可能的话,加上解释(解释为什么一个元素在结果数组中)

标签: javascript arrays loops object matrix


【解决方案1】:

这是一种可能的方法:

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

【讨论】:

  • 很好,谢谢!!!,那个代码可以工作,但是我忘记了,重复的元素必须在所有的对象中,你能做这个改变吗?
  • 我不确定我是否理解。如果我理解正确,您正在寻找一个函数,如果 all 对象具有相同的键,则返回第一个对象,否则不返回任何内容??
【解决方案2】:

这是我的理解。 (我用您的数组对其进行了测试并给出了正确的结果):

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

【讨论】:

  • 我刚刚用你的代码更新了我的代码,没有错误,但它返回具有相同对象的相同数组。 :( 你能告诉我我是否正确实施了吗?
  • @CanKerDiAlike 结果存储在result 数组中,而不是arr 本身。 console.log(result); 记录正确答案。
  • 是的,如果你检查代码我是控制台。记录“结果”,它给了我同样的结果。
  • 检查与console.log ("Result: ",result)的行
  • 你做this.arr = field 你确定field 就像你在示例中发布的数组。
猜你喜欢
  • 1970-01-01
  • 2023-01-26
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
相关资源
最近更新 更多