【问题标题】:How to filter objects with different keys in array?如何过滤数组中具有不同键的对象?
【发布时间】:2020-01-07 09:14:50
【问题描述】:

我有这样的对象:

{
      "name": "Ola",
      "dates": [
        {
          "7.01.2020": [1, 2, 3]
        },
        {
          "8.01.2020": [4, 5, 6]
        },
        {
          "9.01.2020": [7, 8, 9]
        }
      ],
      "id": 7
    }

我需要过滤日期对象以检查是否有特定日期并返回它的值(例如,如果有 7.01.2020)。当我尝试使用前 user.dates 时,我得到了包含 3 个不同对象的数组,但是当我使用 filteror map 方法时,它不起作用。

当用户选择日期时,我需要检查该日期是否存在并将任务添加到现有日期,如果是新日期,请添加任务日期...

有什么想法吗?谢谢!

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 很多数组方法 - 过滤器、映射、一些等...我认为 user.dates[0] 会给我第一个对象,但返回空数组:/

标签: javascript arrays object


【解决方案1】:

实际上你需要使用 for 循环 如果它不能与过滤器和映射一起使用。我建议您根据上述数组中的键访问日期

let x = {
      "name": "Ola",
      "dates": [
        {
          "7.01.2020": [1, 2, 3]
        },
        {
          "8.01.2020": [4, 5, 6]
        },
        {
          "9.01.2020": [7, 8, 9]
        }
      ],
      "id": 7
    }
    
    let y = Object.values(x.dates);
    for(const [key,value] of Object.entries(y))
    {
    //getting particular date string
      result = Object.keys(value);
      console.log(result);
      //converted date for result
      date = new Date(result);
      console.log(date);
    }
请更改包括返回日期所需的逻辑。

【讨论】:

  • 感谢@Ola Koziol 接受它作为答案。
【解决方案2】:

我可能会使用嵌套循环,其中内部循环位于对象的属性之上:

let result = null;
outer: for (const entry of obj.dates) {
    for (const [key, value] of Object.entries(entry)) {
        if (key === target) {
            result = value;
            break outer;
        }
    }
}

现场示例:

const obj = {
      "name": "Ola",
      "dates": [
        {
          "7.01.2020": [1, 2, 3]
        },
        {
          "8.01.2020": [4, 5, 6]
        },
        {
          "9.01.2020": [7, 8, 9]
        }
      ],
      "id": 7
    };

const target = "7.01.2020";

let result = null;
outer: for (const entry of obj.dates) {
    for (const [key, value] of Object.entries(entry)) {
        if (key === target) {
            result = value;
            break outer;
        }
    }
}
console.log(result);

这样最多只能遍历一次数据,一旦找到匹配项就停止。

如果您知道obj.dates 中的对象只有一个属性,则可以是非嵌套循环:

let result = null;
for (const entry of obj.dates) {
    const [key] = Object.keys(entry);
    if (key === target) {
        result = value;
        break;
    }
}

现场示例:

const obj = {
      "name": "Ola",
      "dates": [
        {
          "7.01.2020": [1, 2, 3]
        },
        {
          "8.01.2020": [4, 5, 6]
        },
        {
          "9.01.2020": [7, 8, 9]
        }
      ],
      "id": 7
    };

const target = "7.01.2020";

let result = null;
for (const entry of obj.dates) {
    const [key] = Object.keys(entry);
    if (key === target) {
        result = entry[key];
        break;
    }
}
console.log(result);

另一种选择是将obj.dates 转换为地图,然后在其上使用get

const map = new Map(obj.dates
    .map(entry => {
        const [key] = Object.keys(entry);
        return [key, entry[key]];
    })
);

const result = map.get(target);

现场示例:

const obj = {
      "name": "Ola",
      "dates": [
        {
          "7.01.2020": [1, 2, 3]
        },
        {
          "8.01.2020": [4, 5, 6]
        },
        {
          "9.01.2020": [7, 8, 9]
        }
      ],
      "id": 7
    };

const target = "7.01.2020";

const map = new Map(obj.dates
    .map(entry => {
        const [key] = Object.keys(entry);
        return [key, entry[key]];
    })
);

const result = map.get(target);

console.log(result);

这会完整传递数据,然后在生成的 Map 上进行散列(或类似)查找。如果您需要查找多个目标(因为您只构建一次地图),这很有用。请注意,此版本假定 obj.dates 中的对象只有一个属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多