【问题标题】:Filter nested array inside different objects and return object with new filtered array过滤不同对象内的嵌套数组并返回具有新过滤数组的对象
【发布时间】:2021-03-28 21:53:29
【问题描述】:

我有包含我希望过滤的数组的对象。我想根据类别和划分过滤一个类数组,然后用过滤后的数组返回新对象。

这是 JSON 的样子:

    { "monday": [
    { "id": 1, "time": "sometime", "class": "some class", "age": "12", "category": "jazz", "division": "junior" },
    { "id": 2, "time": "sometime", "class": "some class", "age": "12", "category": "tap", "division": "senior" },
    { "id": 3, "time": "sometime", "class": "some class", "age": "12", "category": "hip hop", "division": "teen" }
  ],
  "tuesday": [
    { "id": 1, "time": "sometime", "class": "some class", "age": "12", "category": "jazz", "division": "teen" },
    { "id": 2, "time": "sometime", "class": "some class", "age": "12", "category": "tap", "division": "teen" },
    { "id": 3, "time": "sometime", "class": "some class", "age": "12", "category": "hip hop", "division": "teen" }
  ],
  "wednesday": [
    { "id": 1, "time": "sometime", "class": "some class", "age": "12", "category": "tap", "division": "teen" },
    { "id": 2, "time": "sometime", "class": "some class", "age": "12", "category": "jazz", "division": "teen" },
    { "id": 3, "time": "sometime", "class": "some class", "age": "12", "category": "hip hop", "division": "teen" }
  ]
}

这是用于过滤和映射过滤数组的反应代码。

const [classes, setClasses] = useState(data);
  const [category, setCategory] = useState(category);
  const [division, setDivision] = useState(division);

  useEffect(() => {
    let filteredClasses = data;
    if (category !== 'all') {
      filteredClasses = filteredClasses.filter(
        (classes) => classes.category === category
      );
    }
    if (division !== 'all') {
      filteredClasses = filteredClasses.filter(
        (classes) => classes.division === division
      );
    }
    setClasses(filteredClasses);
  }, [category, division]);
     <ul>
            {classes.monday.map((item) => (
              <li key={item.order}>
                {item.time} <br />
                {item.class} <br />
                {item.age}
              </li>
            ))}
          </ul>
          <ul>
            {classes.tuesday.map((item) => (
              <li key={item.order}>
                {item.time} <br />
                {item.class} <br />
                {item.age}
              </li>
            ))}
          </ul>

对此的任何帮助将不胜感激。

【问题讨论】:

  • 你没有返回 jsx 也没有返回 map 函数。你能试试吗??
  • 对不起,我明白这有多令人困惑。我从代码示例中截取了返回部分。

标签: javascript arrays reactjs


【解决方案1】:

看起来您正试图在外部 classes 对象上调用 filter(),而不是在单个属性数组上调用。在这种情况下,您将需要遍历包含对象的 Object.keys() 并依次过滤每个引用的数组。

这是一个示例,对Object.keys() 返回的键数组调用reduce(),并将filter() 的结果分配回累加器中的相同键。

const classes = { "monday": [{ "id": 1, "time": "sometime", "class": "some class", "age": "12", "category": "jazz", "division": "junior" }, { "id": 2, "time": "sometime", "class": "some class", "age": "12", "category": "tap", "division": "senior" }, { "id": 3, "time": "sometime", "class": "some class", "age": "12", "category": "hip hop", "division": "teen" }], "tuesday": [{ "id": 1, "time": "sometime", "class": "some class", "age": "12", "category": "jazz", "division": "teen" }, { "id": 2, "time": "sometime", "class": "some class", "age": "12", "category": "tap", "division": "teen" }, { "id": 3, "time": "sometime", "class": "some class", "age": "12", "category": "hip hop", "division": "teen" }], "wednesday": [{ "id": 1, "time": "sometime", "class": "some class", "age": "12", "category": "tap", "division": "teen" }, { "id": 2, "time": "sometime", "class": "some class", "age": "12", "category": "jazz", "division": "teen" }, { "id": 3, "time": "sometime", "class": "some class", "age": "12", "category": "hip hop", "division": "teen" }] }

const division = 'all';
const category = 'jazz';

const filteredClasses = Object.keys(classes)
  .reduce((acc, day) => {
    acc[day] = classes[day].filter(_class =>
      (division === 'all' || _class.division === division)
      && (category === 'all' || _class.category === category));

    return acc;
  }, {});

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

下面是一个使用Object.fromEntries()、map() 的示例,并将filter() 调用移动到一个单独的函数中。

const classes = { "monday": [{ "id": 1, "time": "sometime", "class": "some class", "age": "12", "category": "jazz", "division": "junior" }, { "id": 2, "time": "sometime", "class": "some class", "age": "12", "category": "tap", "division": "senior" }, { "id": 3, "time": "sometime", "class": "some class", "age": "12", "category": "hip hop", "division": "teen" }], "tuesday": [{ "id": 1, "time": "sometime", "class": "some class", "age": "12", "category": "jazz", "division": "teen" }, { "id": 2, "time": "sometime", "class": "some class", "age": "12", "category": "tap", "division": "teen" }, { "id": 3, "time": "sometime", "class": "some class", "age": "12", "category": "hip hop", "division": "teen" }], "wednesday": [{ "id": 1, "time": "sometime", "class": "some class", "age": "12", "category": "tap", "division": "teen" }, { "id": 2, "time": "sometime", "class": "some class", "age": "12", "category": "jazz", "division": "teen" }, { "id": 3, "time": "sometime", "class": "some class", "age": "12", "category": "hip hop", "division": "teen" }] }

const division = 'all';
const category = 'jazz';

const filterClassArray = (arr) => (
  arr.filter(_class =>
    (division === 'all' || _class.division === division)
    && (category === 'all' || _class.category === category)
  ));

const filteredClasses = Object.fromEntries(
  Object.keys(classes).map(day => [day, filterClassArray(classes[day])]
  ));

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

【讨论】:

  • 感谢沙丁鱼,正是我所追求的!完美运行。
猜你喜欢
  • 2017-03-08
  • 2022-01-26
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
  • 2020-09-17
  • 2021-07-08
相关资源
最近更新 更多