【问题标题】:Iterate over array of object using map till the second last object使用 map 遍历对象数组直到倒数第二个对象
【发布时间】:2019-03-14 05:33:31
【问题描述】:

我有一个对象数组,其中所有对象都具有相同的键,除了最后一个对象。认为数组有值,并且将所有这些值作为一个整体表示,我有一个键,我最终将键与数组中的值一起按下。

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,这是数组类型。

当我使用map 迭代events 时,我想跳过最后一个对象,因为它没有任务、taskDuration 和状态等键。因此,当我获取这些值时不会有任何问题。

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:
    events.slice(0, events.length-1).map(<function>);
    

    这将忽略最后一个元素,所有 n-1 个条目将被馈送到 map

    更新

    数组名称是 events 而不是 event,因此它应该是 events.length

    【讨论】:

    • events.slice(0, event.length-1).map((event) =&gt;{}); where each event Failed to compile Events.js Line 382: Unexpected use of 'event' no-restricted-globals Line 393: Unexpected use of 'event' no-restricted-globals跨度>
    • 你能提供一个示例输入和输出,以便我也可以测试
    • 假设我有事件[{task: "house cleaning", taskDuration:60, status:"n/a"}, {task: "waste dumping", taskDuration:30, status:"n/a"}, {task: "dishwashing", taskDuration:80, status:"n/a"}, {address: "90/1, park street road london", landmark:"neville's studio"}] 现在最后一个对象是关键
    • var events = [{task: "house cleaning", taskDuration:60, status:"n/a"}, {task: "waste dumping", taskDuration:30, status:"n/ a"}, {task: "dishwashing", taskDuration:80, status:"n/a"}, {address: "90/1, park street road london", landmark:"neville's studio"}]; console.log(events.slice(0, events.length-1).map((event) =>event.task));
    • 也在 events.slice(0, event.length-1).map((event) =>{}); event.length 错误,它应该是 events.length 仅供参考
    【解决方案2】:

    您仍然可以使用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。 slice 可以安全地在你的 prop 上执行,因为它是浅拷贝。


    或者最重要的是,问问自己,为什么你有这个完全奇怪的数据结构,它的最后附加了键。也许重新考虑您的数据,而不是一开始就为自己制造这个问题。

    【讨论】:

    • 当我从 child-parent-anotherChild 传递这个道具时.....我有一个表格,其中每一行代表对象,当我点击按钮时它有一个按钮,它应该传递这个键和那一行(表示单个对象).....我不想将它添加到另一个变量,尽管我可以轻松地做到这一点
    • 那么你不能通过{ key: 'something', items: [] }吗?而不是将它们全部合并到一个数组中?
    • 是的,虽然我必须更改很多东西,但它确实解决了,因为现在它不是数组,而不是这个对象内部的对象我有数组.....无论我在哪里,更改数据结构都涉及大量工作使用相同的数据......虽然它解决了问题
    【解决方案3】:
    res.data.resultSet.homeTask.forEach((element,index) => {})
    

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

    【讨论】:

    • 我发布(并且已经删除)了相同的答案,但是当根据问题使用 map() 时,这会产生问题,因为结果数组将具有最后一个 undefined 元素。
    • 代码中提到了forEach 的操作。我认为他很困惑。
    【解决方案4】:

    嗯,你可以试试这个

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

    【讨论】:

    • console.log("this event:"+events.slice(0, event.length-1).sort((a, b) =&gt; a.expectedEnd.split(':').reverse().join().localeCompare(b.expectedEnd.split(':').reverse().join()))); 在这种情况下你将如何避免
    【解决方案5】:

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

    【讨论】:

    • 让我把这个直接的 resultSet 有 homeTask 这是一个对象列表这个数组表中的每一行都有一个按钮,单击按钮时它应该发送单个对象表示行+整个数组的键表示 homeTaskKey........但是在表中我不想拥有homeTaskKey 的一行,如果我不对其进行切片,那么它也会给我的密钥
    猜你喜欢
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    相关资源
    最近更新 更多