我有一个“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
值时才返回
这是一种可能的方法:
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;
}
这是我的理解。 (我用你的阵列测试了它并给出了正确的结果):
// 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);