【问题标题】:How to map items from array of objects into state as another array如何将对象数组中的项目映射为另一个数组的状态
【发布时间】:2020-09-03 21:19:53
【问题描述】:

我知道标题听起来多余,但也许更具体的解释会有所帮助。我正在从 fetch 请求中检索项目,并将其作为对象数组返回。我创建了一个函数,将请求的数据存储到我映射的 const 变量中,并从每个数组项返回 item.date_created 值。然后我的问题是如何获取每个 date_created 值并将它们存储在另一个传递给 state 的数组中。

当尝试将每个值存储在一个数组中时,它会为每个项目创建一个数组,而不是只创建一个包含所有值的数组。我知道 .map 函数的目的是单独隔离和返回每个值,因此我的问题是如何将它们传递给一个特定的数组而不是单独的数组。如果这是完全错误的方法,请提供一种方法来完成此操作。

返回值:

entries: Array(10)
  0: {4: "X", 5: "X", 6: "X", 7: "X", 8: "X", 9: "X", id: "X", form_id: "X", 
   post_id: null, date_created: "2020-08-01 01:28:59", date_updated: "2020-08-10 01:28:59", …}
  1: {4: "X", 5: "X", 6: "X", 7: "X", 8: "X", 9: "X", id: "X", form_id: "X", 
   post_id: null, date_created: "2020-08-10 02:56:03", date_updated: "2019-11-08 02:56:03", …}

我的代码结构如下:

fetchStartSubmissions = () => {
  const fetchStart = moment(this.state.startDate).format('yyyy-MM-DD');
  const resData = this.state.formEntries.entries;

  resData.map(item => {

    if (item.date_created = fetchStart) {

      var items = [item.date_created];
      console.log(items);
      this.setState({
        startItems: [items],
      });

    }

  })
}

输出:

["2020-08-01"]
["2020-08-10"]

【问题讨论】:

  • .map 返回一个新数组。所以你做const newArray = [{ date_created: "2020-08-01" }, {date_created: "2020-08-10"}].map(x => { return x.date_created; });

标签: javascript arrays object


【解决方案1】:

编辑date_created的新结构。

为此使用Array#map

let entries = [
   {4: "X", 5: "X", 6: "X", 7: "X", 8: "X", 9: "X", id: "X", form_id: "X", 
   post_id: null, date_created: "2020-08-01 01:28:59", date_updated: "2020-08-10 01:28:59"},
   {4: "X", 5: "X", 6: "X", 7: "X", 8: "X", 9: "X", id: "X", form_id: "X", 
   post_id: null, date_created: "2020-08-10 02:56:03", date_updated: "2019-11-08 02:56:03"}
];

let result = entries.map( ({date_updated}) => date_updated.split(' ')[0] );
console.log(result);

【讨论】:

  • 这可行,但是 date_create 也附有时间戳。任何想法如何在将日期映射到新数组之前修剪时间戳?
  • 我实际上看不到 date_create 的时间戳在哪里,或者这是您没有向我们展示的部分?我仅将此属性视为格式为 YYYY-MM-DD 的字符串。
  • 很抱歉。我刚刚重新运行了几次请求,以确保它确实传递了时间戳。我不太清楚为什么最初的示例请求没有,但我已经用正确的响应更新了问题。
  • 好吧,我没看到这个。我为此更改了代码。
【解决方案2】:

您可以使用 reduce 将数据添加到新数组中。也可以使用子字符串来截断 hh:mm:ss

const arr = [{
  4: "X",
  5: "X",
  6: "X",
  7: "X",
  8: "X",
  9: "X",
  id: "X",
  form_id: "X",
  post_id: null,
  date_created: "2020-08-01",
  date_updated: "2020-08-10 01:28:59"
}, {
  4: "X",
  5: "X",
  6: "X",
  7: "X",
  8: "X",
  9: "X",
  id: "X",
  form_id: "X",
  post_id: null,
  date_created: "2020-08-10",
  date_updated: "2019-11-08 02:56:03"
}]

const result = arr.reduce((acc, {
  date_created
}) => {
  const date = date_created.substring(date_created.indexOf(' '));
  acc.push(date);
  return acc;
}, []);
console.log(result)

【讨论】:

  • 这导致 -> 0: " 01:28:59" 1: " 02:56:03" 2: " 15:05:16"
  • 您是否有理由使用reduce 而不是map(在这种情况下更短)以及您使用substring 索引为-1 的原因(它可以传递整个字符串)?
猜你喜欢
  • 2020-11-01
  • 2021-02-12
  • 2021-12-06
  • 2021-12-08
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 2018-08-14
  • 1970-01-01
相关资源
最近更新 更多