2016-11-20 135 views
0

我有一个包含项目的数组。如何筛选具有相同名称但不同值的项目的数组?

我做这个数组通过使用此功能收集表单数据:

getFormdata : function(form) { 
     var formdata = $(form) 
      .serializeArray() 
      .filter(function (item) { 
       return item.name != "__RequestVerificationToken" 
      }); 

     return formdata; 
    } 

当我在形式的复选框,当检查我得到其中一个有值的数组中的两个项目

真正

和其他有

我使用jquery过滤functon到滤镜阵列,但我想不通我怎么能discared具有价值

虚假项目

阵列的不必要的结果:

enter image description here

我尝试:

getFormdata : function(form) { 
     var formdata = $(form) 
      .serializeArray() 
      .filter(function (item) { 
       return item.name != "__RequestVerificationToken" && (item.name == "IsActive" && item.value != "false"); 
      }); 

     return formdata; 
    } 

但这种过滤掉所有元素,而不仅仅是一个我想移除。

我该怎么做?

编辑:

项目NR 2,如果有两个项目具有相同的名称应该只被删除。 如果我只有一个名称为“IsActive”的项目,则不应删除第2个数字

+0

你能不能给我们输入数组的个例和axpected结果 –

+0

我有,你看不出来的形象呢? desiered结果基本相同,但没有第nr 2 – ThunD3eR

+0

,所以你有2个属性的名称和值,但你想要什么结果?也许是其他图片 –

回答

1

如果两个 “IsActive” 的存在,去除伪之一。否则,请保持独立。 添加了删除验证令牌。 在第二个滤波器之前移动检查值!=“false”,可能会使条件和增益性能短路。

var test = [ 
 
    { name: "__RequestVerificationToken", value: "whatever" }, 
 
    { name: "IsActive", value: "true" }, 
 
    { name: "updateRate", value: "sss" }, 
 
    { name: "IsActive", value: "false" }, 
 
    { name: "somethingElse", value: "weee" } 
 
]; 
 

 
console.log(test.filter(function(element, index, array){ 
 
    return element.name != "__RequestVerificationToken" && (
 
      element.value != "false" 
 
      || array.filter(function(element2){ 
 
       return element2.name == element.name 
 
      }).length < 2 
 
     ); 
 
})); 
 

 
var test = [ 
 
    { name: "__RequestVerificationToken", value: "whatever" }, 
 
    { name: "updateRate", value: "sss" }, 
 
    { name: "IsActive", value: "false" }, 
 
    { name: "somethingElse", value: "weee" } 
 
]; 
 

 
console.log(test.filter(function(element, index, array){ 
 
    return element.name != "__RequestVerificationToken" && (
 
      element.value != "false" 
 
      || array.filter(function(element2){ 
 
       return element2.name == element.name 
 
      }).length < 2 
 
     ); 
 
}));

+0

你是对的钱,我有点快,并接受了其他答案这是一个很好的尝试,这个问题并没有包括所有信息@Nina Scholz张贴她的答案时 – ThunD3eR

0

您可以先检查是否存在活动项目,然后在稍后检查过滤时使用它。

function filter(array) { 
 
    var isActive = array.some(function (item) { 
 
      return item.name === "IsActive" && item.value === "true"; 
 
     }); 
 
    return array.filter(function (item) { 
 
     return (
 
      item.name !== "__RequestVerificationToken" && item.name !== "IsActive" || 
 
      item.name === "IsActive" && (item.value === "true" || !isActive) 
 
     ); 
 
    }); 
 
} 
 

 
var data0 = [{ name: 'IsActive', value: 'true' }, { name: 'IsActive', value: 'false' }, { name: 'Name', value: 'sss' }, { name: 'UpdateRate', value: '121212' }, { name: '__RequestVerificationToken', value: 'true' }, { name: '__RequestVerificationToken', value: 'false' }], 
 
    data1 = [{ name: 'IsActive', value: 'false' }, { name: 'Name', value: 'sss' }, { name: 'UpdateRate', value: '121212' }, { name: '__RequestVerificationToken', value: 'true' }, { name: '__RequestVerificationToken', value: 'false' }]; 
 

 
console.log(filter(data0)); 
 
console.log(filter(data1));
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

这个伎俩。我必须在阅读时说,我认为它不能正确,因为你排除了“IsActive”的财产,但第二条线进场。好一个! – ThunD3eR

+0

是的,在第一个检查中排除并包含在第二个检查中。 –

+0

这看起来有缺陷。如果它是列表中唯一的IsActive,那么原来的帖子就会说IsActive包含错误。如果该逻辑是错误的并且是唯一的,则该逻辑将移除它。 – Taplar

相关问题