【问题标题】:how to check if object.values in array are the same in sequence如何检查数组中的object.values是否按顺序相同
【发布时间】:2021-08-16 03:47:28
【问题描述】:

我的 react 应用程序中有一个案例,我必须检查数组中对象的值是否按顺序相同,并且它们的其他属性按顺序增加 1,然后如果满足条件,则将其推送到新数组。序列中的值数量由输入提供。

例如,用户想要将 4 个对象推送到具有 "status": true 的新数组中

objects =  [
{
"someID": 0,
"status": false,
},
{
"someID": 1,
"status": false,
},
{
"someID": 2,
"status": true,
},
{
"someID": 3,
"status": true,
},
{
"someID": 4,
"status": true,
},
{
"someID": 6,
"status": true,
},
{
"someID": 7,
"status": false,
},
{
"someID": 8,
"status": false,
},
{
"someID": 9,
"status": true,
},
{
"someID": 10,
"status": true,
},
{
"someID": 11,
"status": true,
},
{
"someID": 12,
"status": true,
},

]

从我的一些 ID 为 2、3、4、6 的示例对象中,满足具有 status: true 的条件,但它们的 someID 值不会按顺序增加 1,另一方面,那些具有 someID 9、10 的对象, 11, 12 的 status 值为 true,someID 的值依次增加 1。所以结果应该是

newArray = [
{
"someID": 9,
"status": true,
},
{
"someID": 10,
"status": true,
},
{
"someID": 11,
"status": true,
},
{
"someID": 12,
"status": true,
},
]

【问题讨论】:

  • 这里的输出应该是什么?
  • 一个包含满足要求的对象的数组,对于我提供的示例,它将是 newArray = [ {"someID": 2,"status": true,}, {"someID": 3, "status": true,}, {"someID": 4,"status": true,}, ]
  • 连续2次这样的情况预计会有什么结果?你有 [2,3] 和 [3,4] 满足条件,结果如何?当您有多个匹配项时,您只希望第一个序列作为返回?它是仅基于特定对象属性还是应该匹配该属性并且所有其他道具(除了 someID)应该匹配?
  • 第一次遇到多个匹配就足够了,实际上我问错了,现在我明白了,情况是推送到新数组的对象需要具有相同的状态属性及其someID属性值必须按顺序增加,即我们需要 4 个(仍然值来自用户,可以是 4,但可以是 3 或 1 或 5)对象按顺序与 "status": true 和它们的 "someID" 顺序像 [0,1, 2,3] 或 [3,4,5,6] 但不能是 [3,4,6,7] 即使它们的状态按顺序为真@buzatto

标签: javascript arrays reactjs sorting


【解决方案1】:

您可以查看status 和前任或继任者。

const
    objects = [{ someID: 0, status: true }, { someID: 1, status: false }, { someID: 2, status: true }, { someID: 3, status: true }, { someID: 4, status: true }, { someID: 5, status: false }, { someID: 6, status: false }, { someID: 7, status: true }],
    result = objects.filter(({ someID, status }, i, a) => status && (
        a[i - 1]?.status && a[i - 1]?.someID === someID - 1 ||
        a[i + 1]?.status && someID + 1 === a[i + 1]?.someID
    ));

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

【讨论】:

  • 如果我没记错的话,这仅在我需要 3 次 true 的情况下才有效,但是当我想要 4 或 5 个对象顺序为 true 时它会起作用吗?,数量从input 提供依次具有"status": true 的对象。我还是没有经验,你能告诉我? 在这种情况下做什么a[i - 1]?.status 吗?
  • 您只需要按顺序排列两个项目。仅供参考:optional chaining operator ?.
【解决方案2】:

在一个通用函数下面,它接受你的数组并遍历一个 for 循环。您传递属性和预期的匹配值,就像预期的序列中的确切计数一样:

const getSequence = (arr, count, key = 'status', value = true, id = 'someID') => {
  let match = []
  const isIDIncremental = (obj) => {
    if(match.length === 0) return true
    return obj[id] - 1 === match[match.length - 1][id]
  }

  for(const obj of arr) {
    if(match.length === count) break
    if(obj[key] === value && isIDIncremental(obj)) {
      match.push(obj)
    } else {
      match = []
    }
  }
  
  return match.length === count ? match : []
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-25
    • 2018-10-27
    • 1970-01-01
    • 2013-10-12
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多