我有一个“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/