【问题标题】:How to filter array that has item with the same name but different value?如何过滤具有相同名称但不同值的项目的数组?
【发布时间】:2016-11-20 15:48:13
【问题描述】:

我有一个包含项目的数组。

我通过这个函数收集表单数据来制作这个数组:

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

        return formdata;
    }

当我在表单中有一个复选框并且选中它时,我会在数组中得到两个项目,其中一个具有值

是的

另一个有

我正在使用 jquery filter 函数来过滤数组,但我不知道如何丢弃具有值的项目

数组的非预期结果:

我的尝试:

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

        return formdata;
    }

但这会过滤掉所有元素,而不仅仅是我想要删除的元素。

我该怎么做?

编辑:

只有当有两个同名的项目时,才应删除项目编号 2。 如果我只有一个名为“IsActive”的项目,则不应删除 nr 2

【问题讨论】:

  • 你能给我们一个输入数组和预期结果的例子
  • 我有,你看不到图片吗?期望的结果基本相同,但没有项目 nr 2
  • 所以你有 2 个属性名称和值,但你想要什么结果?也许是另一张图片
  • 旁注,根据你的条件,你真的不需要名字检查。第二个名字 == check if true 也会断言第一个名字为真。
  • 尝试用一句话描述条件(然后将其转换为代码):"Keep an item if ..." 。我相信你想要item.name === 'isActive' ? item.value !== 'false' : item.name !== '__RequestVerificationToken'

标签: javascript jquery arrays


【解决方案1】:

如果存在两个“IsActive”,则删除虚假的一个。否则,别管它。 添加了验证令牌的删除。 在第二个过滤器之前移动了对 value != "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
          );
}));

【讨论】:

  • 你说得对,我有点快并接受了另一个答案,这是一个很好的尝试,当@Nina Scholz 发布她的答案时,问题并未包含所有信息
【解决方案2】:

您可以先检查是否存在活动项目,然后将其用作稍后检查以进行过滤。

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

【讨论】:

  • 这成功了。我必须说,在阅读时我认为这是不对的,因为您排除了“IsActive”属性,但第二行开始发挥作用。不错!
  • 是的,在第一次检查中排除并在第二次检查中包含。
  • 这看起来有缺陷。如果 IsActive 是列表中唯一的 IsActive,则原始帖子说将 IsActive 包含为 false。如果它是 false 并且是唯一的,则此逻辑将删除它。
  • @Taplar 你是对的,但我缺乏解释是 Nina 错过它的原因。不应该被否决
猜你喜欢
  • 2019-09-09
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
  • 1970-01-01
相关资源
最近更新 更多