【问题标题】:Group array items on basis of dynamic keys根据动态键对数组项进行分组
【发布时间】:2023-03-24 09:05:01
【问题描述】:

我有一个类似这样的数组:

[
  { KEY1: 190 },
  { KEY1: 10 },
  { KEY2: 50 },
  { KEY2: 20 },
  { KEY3: 155 },
  { KEY3: 20511 }
]

我想把它转换成:

[
  {
    KEY1: 190,
    KEY2: 50,
    KEY3: 155 
  },
  {
    KEY1: 10,
    KEY2: 20,
    KEY3: 20511
  }
]

这些键是动态的,可以是 n 次。

【问题讨论】:

  • 这里的键是动态的,所以不能像 res[obj.name] 那样使用它作为索引。我已经在我的问题中提到了这一点。键的数量定义了行数。
  • 我不知道你在问什么,因为我看不出你想按照哪个标准将数组分成组。
  • 嗨,Dan,如果您看到两个数组中的键相同,但它们的值不同。所以在 0 位置我们有 { TK_CEOLTIPTOTSHARESRESER : 190,TK_CEOSHARESOUTSTANDING : 50 , TK_EMPLOYEEOPTIONSGRANTE : 155 } 而第一个位置有 { TK_CEOLTIPTOTSHARESRESER : 10, TK_CEOSHARESOUTSTANDING : 20, TK_EMPLOYEEOPTIONSGRANTE : (20511}如果我们有另一个密钥,将会增加。希望我能给你解释一下。
  • 相同的键总是相互跟随还是分散?
  • 这些重复的键是否总是相等的?

标签: javascript arrays typescript


【解决方案1】:

您可以使用一个对象来跟踪相同键的索引,并使用给定数据的一个相同键构建对象。

const
    data = [{ TK_CEOLTIPTOTSHARESRESER: 190 }, { TK_CEOLTIPTOTSHARESRESER: 10 }, { TK_CEOSHARESOUTSTANDING: 50 }, { TK_CEOSHARESOUTSTANDING: 20 }, {  TK_EMPLOYEEOPTIONSGRANTE: 155 }, { TK_EMPLOYEEOPTIONSGRANTE: 20511 }],
    indices = {},
    result = data.reduce((r, o) => {
        const
            key = Object.keys(o)[0],
            index = indices[key] = (indices[key] ?? -1) + 1;

        Object.assign(r[index] ??= {}, o);
        return r;
    }, []);

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

【讨论】:

  • 尼娜,我编辑了这个问题,以便于阅读。请考虑更新您的答案,未经您的同意,我不想干预它:)
  • 这个答案也适用于不断变化的数据。无需更改。
  • 哈!我不知道您可以为 sn-p 控制台添加样式。
  • @Nina 我重命名了这些键,以便更好地理解它们。 KEY1KEY2KEY3TK_CEOLTIPTOTSHARESRESERTK_CEOLTIPTOTSHARESRESER 可读性更好。我认为如果您不坚持使用 OP 的杂乱按键,您的答案也会更好地阅读。
【解决方案2】:

这将是另一种(在我看来更容易理解)的处理方式。它创建一个新对象数组,并将键和值分配给尚无该键的最早对象。

const oldData = [
  { KEY1: 190 },
  { KEY1: 10 },
  { KEY2: 50 },
  { KEY2: 20 },
  { KEY3: 155 },
  { KEY3: 20511 }
]

const convert = (arr) => {
  let newArr = []
  arr.forEach((obj) => {
    for (let i = 0; i < newArr.length + 1; i++) {
      newArr[i] = newArr[i] || {}
      let key = Object.keys(obj)[0]
      if (!newArr[i].hasOwnProperty(key)) { 
        newArr[i][key] = obj[key]
        break
      }
    }
  })
  return newArr
}

const newData = convert(oldData)
console.log(newData)

【讨论】:

    猜你喜欢
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 2020-10-21
    • 2022-08-16
    相关资源
    最近更新 更多