使用地图遍历对象数组,直到倒数第二个对象

时间:2019-03-14 05:33:31

标签: javascript reactjs

我有一个对象数组,其中除最后一个对象外,所有对象都具有相同的键。认为像数组一样具有值,并总体上表示所有这些值,我有一个键,最后将键与数组中的值一起按下。

homeTask 是对象列表,这些对象是值,而 homeTaskKey 是表示homeTask的键

        res.data.resultSet.homeTask.forEach(element => {
                      var singleEvent={
                        task:'',
                        taskDuration:'',
                        status:'',
                      };

                      singleEvent.task=element.task;
                      singleEvent.taskDuration=element.taskDuration;
                      singleEvent.status=element.status;

                      newEvents.push(singleEvent);


                    });
                    newEvents.push(res.data.resultSet.homeTaskKey);


                   addEvent(newEvents);
              }

addEvent是父组件的props方法,其中我将数组设置为状态变量名称为events,这是数组类型。

当我使用events遍历map时,我想跳过最后一个对象,因为它没有像task,taskDuration和status这样的键。因此,当我获取这些值时,它不会有任何问题。

5 个答案:

答案 0 :(得分:1)

您仍然可以使用map,但是只需在地图完成后弹出最后一个元素。例如:

const newEvents = homeTask.map(({ task, taskDuration, status }) => ({
  task, taskDuration, status
}))
newEvents.pop()
addEvent(newEvents)

或者只用任务密钥替换最后一个项目,因为您知道最后一个项目将是垃圾:

newEvents[newEvents.length - 1] = res.data.resultSet.homeTaskKey

或者在映射之前仅slice个数组,然后像执行操作一样将taskKey推到末尾。切片很浅,可以安全地在道具上执行。


或者最重要的是,问问自己为什么拥有一个完全奇怪的数据结构,并在其末尾附加了密钥。也许首先要重新考虑您的数据,而不是首先为您自己创建此问题。

答案 1 :(得分:1)

events.slice(0, events.length-1).map(<function>);

这将忽略最后一个元素,所有n-1个条目都将被送入地图

更新

数组名称是事件而非事件,因此应为events.length

答案 2 :(得分:0)

res.data.resultSet.homeTask.forEach((element,index) => {})

函数的第二个参数是索引,可以通过与数组的总长度进行比较来确定倒数第二个元素。

答案 3 :(得分:0)

嗯,您可以尝试

res.data.resultSet.homeTask.forEach(element => {
    if(!element.task)
        return false;
    ...bla bla bla
}

答案 4 :(得分:0)

map()方法创建一个新数组,并为每个数组元素调用一个函数。

因此它从源数组创建了一个相同长度的数组。

您需要的是filter() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

这样的事情;

const tasks = res.data.resultSet.homeTask.filter((element) => {
  const { task, taskDuration, status } = element;
  return task && taskDuration && status; 
});