【问题标题】:modify return values from Object.fromEntries修改 Object.fromEntries 的返回值
【发布时间】:2020-11-17 00:24:51
【问题描述】:

我正在尝试使用.fromEntries() 修改对象的值。 如下图所示,我实际上是在返回一个修改后的小时数组,但是在函数结束后,它返回的是完整的数组,而不是更新后的数组。

提前感谢您的任何想法!


    let filteredDates = Object.fromEntries(Object.entries(slots).filter(([slot, value]) => {
        let result = datesArray.some(filterdates => {
            return filterdates.some(filter => slot === filter)
        })
        let currentDay = slot === day ? value.filter(time => time >= currentHour) : null
        result = currentDay ? currentDay : result ? value : result
        console.log("result",result)
        return result
    }))
    
    console.log("filteredDates",filteredDates)

【问题讨论】:

  • filter() 不返回回调函数的结果。只要回调函数返回一个真值,它就会返回原始数组的元素。
  • 如果您想通过转换原始数组中的值来返回一个新数组,请使用map()
  • 感谢您的评论,问题是我不能返回 null、undefined 或 false,否则我会收到 TypeError: Iterator value false is not an entry object
  • 你应该返回一个[newkey, newvalue]形式的数组
  • 如果你想有条件返回使用reduce(),或者使用.filter(testfunction).map(conversionfunction)

标签: javascript arrays object ecmascript-2019


【解决方案1】:

我认为最接近您当前方法的解决方案是首先使用map,为您要删除的条目返回null,然后在null 条目中返回filter,以防止Object.fromEntries 抛出。在代码中:

const myObj = { "a": 1, "b": 2, "c": 3 };

// Your modification
const doubleWithoutB = ([ key, value ]) => 
  key === "b"            // This is your filter logic
    ? null
    : [ key, value * 2 ] // Here's your map operation
    

console.log(
  Object.fromEntries(
    Object
      .entries(myObj)
      .map(doubleWithoutB)
      .filter(kvp => kvp !== null) // Get rid of the null kvps
  )
)

如果您想一次性完成,您可以自己跳过 Object.fromEntriesreduce 到对象中的条目:

const myObj = { "a": 1, "b": 2, "c": 3 };

// Your modification
const reduceDoubleWithoutB = (acc, [ key, value ]) => 
  Object.assign(
    acc,
    key === "b" 
      ? {}
      : { [key]: value * 2 }
  )
    

console.log(
  Object
    .entries(myObj)
    .reduce(reduceDoubleWithoutB, {})
)

【讨论】:

  • 感谢您的回答!我使用您的两个答案来解决它。我删除了 Object.fromEntries() 并添加了 .filter(kvp => kvp !== null)。现在工作正常。谢谢 最终代码:let filteredDates = Object.entries(slots).map(([slot, value]) => { let result = datesArray.some(dates => { return dates.some(filter => slot === filter)}) let currentDay = slot === day ? value.filter(time => time >= currentHour) : null result = currentDay ? currentDay : result ? value : null return result }).filter(value => value !== null)
猜你喜欢
  • 2012-07-07
  • 2016-08-03
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 2023-01-05
  • 2013-10-22
  • 2019-03-11
相关资源
最近更新 更多