【问题标题】:Split up single object into multiple objects将单个对象拆分为多个对象
【发布时间】:2019-04-23 06:39:48
【问题描述】:

我有一个 JSON 对象,我想将其拆分为多个对象。我尝试将单个 JSON 对象转换为数组。如果键不存在,即meal1、meal2 等,我无法找出分解单个对象的模式。我什至不确定这是否是最好的方法。感谢您在正确方向上的任何帮助或指示!

之前

{
  "fullName1" : "John Doe",
  "attendance1" : 1,
  "meal1" : "salmon",
  "fullName2" : "Jane Doe",
  "attendance2" : 0
}

想要的结果

{
  "fullName" : "John Doe",
  "attendance" : 1,
  "meal" : "salmon"
},
{
  "fullName" : "Jane Doe"
  "attendance" : 0
}

就我的尝试而言,这就是我已经走了多远:

const entries = [...elements];
// check for valid elements
const isValidElement = element => {
  return element.name && element.value;
};
const isValidValue = element => {
  return (!['radio'].includes(element.type) || element.checked);
};
const formToJSON = elements =>
  [].reduce.call(elements, (data, element) => {
    if (isValidElement(element) && isValidValue(element)) {
      data[element.name] = element.value;
    }
    return data;
  }, {});
//
const singleArray = formToJSON(entries);

【问题讨论】:

  • 密钥是否已知?你在哪里尝试自己解决这个问题?我们不只是分发解决方案。 (此外,没有“JSON 对象”之类的东西;您显示的是 JavaScript 对象文字)
  • 这不是一个数组。此外,您拆分对象的标准似乎还不清楚。是属性名的后缀吗?
  • 这是一个对象,不是数组,所以不能使用你提到的任何数组方法。事实上,由于它只是一个没有子结构的普通对象,我认为您基本上必须手动执行此操作。
  • @ChrisG 感谢您的反馈。我尝试使用 Array.from() 将 JSON 转换为数组并尝试从那里进行操作。

标签: javascript arrays ecmascript-6 ecmascript-5


【解决方案1】:

这里如何分成三个相等的块

const splitIntoThreeChunks = (obj) => {
    let obj1 = {}
    let obj2 = {}
    let obj3 = {}

    const keys = Object.keys(obj)
    const keysLength = keys.length
    let k = 0

    for (let i = 0; i <= keysLength; i++) {
        const key = keys[i]
        if (k === 0) {
            obj1 = { ...obj1, [key]: obj[key] }
            k++
        } else if (k === 1) {
            obj2 = { ...obj2, [key]: obj[key] }
            k++
        } else if (k === 2) {
            obj3 = { ...obj3, [key]: obj[key] }
            k = 0
        }
    }

    return {
        obj1,
        obj2,
        obj3
    }
}

【讨论】:

    【解决方案2】:

    您可以像下面这样使用Object.entriesreduce 来实现此目的

    遍历对象中的每条记录,并将键的最后一位数字存储在临时对象中。

    let obj = {
      "fullName1" : "John Doe",
      "attendance1" : 1,
      "meal1" : "salmon",
      "fullName2" : "Jane Doe",
      "attendance2" : 0
    }
    
    let res = Object.entries(obj).reduce((o, [k, v]) => {
        let [name, number] = k.match(/\D+|\d+$/g)
        o[number] = { ...(o[number] || {}), [name]: v }
        return o
      }, {})
      
    console.log(Object.values(res))

    【讨论】:

    • 谢谢尼蒂什!我很感激!请问o是什么意思?在查看了可能的参数(累加器(acc)、当前值(cur)、当前索引(idx)、源数组(src))之后,只是想更好地理解developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
    • 欢迎@drukelly。 oreduce 将为每次迭代保存的临时对象。如您所见,它始终是reduce 的第一个参数,您可以随意调用它。我们将这个值初始化为reduce(在本例中为空对象)中的最后一个参数。
    • 当我需要reduce 处理对象时,我喜欢称它为o,当我希望它处理数组时,我喜欢称它为a。你可以称它为任何东西。但它是最后返回的。
    • 哦!这只是accumulator
    • 再次感谢 Nitish!您在我的评论后的后续回复解释了它!干杯!
    【解决方案3】:

    在不知道会有多少对象的情况下,最好将它们拆分成一个对象数组。首先遍历键然后检查它的索引。这假定键总是以数字结尾,并且末尾的数字始终是索引。

    var obj = {
      "fullName1" : "John Doe",
      "attendance1" : 1,
      "meal1" : "salmon",
      "fullName2" : "Jane Doe",
      "attendance2" : 0
    };
    var objs = [];
    Object.keys(obj).forEach(function(key) {
      var match = key.match(/(.*)(\d.*)$/);
      var newKey = match[1];
      var index = parseInt(match[2]) - 1;
      objs[index] = objs[index] || {};
      objs[index][newKey] = obj[key];
    })
    console.log(objs);

    【讨论】:

    • 非常感谢!你让我很快乐!我完全赞成(也许当我有足够的代表点时我会)
    猜你喜欢
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    相关资源
    最近更新 更多