【问题标题】:Add json key from array从数组中添加 json 键
【发布时间】:2018-09-18 18:05:31
【问题描述】:

我正在尝试将元素从数组的项中添加到 JSON,但我正在努力将元素传递给 JSON。

这是我的代码:

var j = {
    "Root": {
        "a": "1800,1200,3100",
        "b": "1500,1999,2001",
        "c": "40,60,50",
        "d": "this is not needed",
        "e": "nor this one"
    }
};
var root = j.Root,
    l = root.a.split(",").length,
    hash = ["a", "b", "c"];


for (var i = 0; i < l; i++) {
    for (var x = 0; x < hash.length; x++) {
        root['row_' + i] = {
            "a": root.a.split(",")[i],
            "b": root.b.split(",")[i],
            "c": root.c.split(",")[i] // I don't want to do this for each key
        };
    }
}



for (var x = 0; x < hash.length; x++) {
    delete root[hash[x]];
}

console.log(JSON.stringify(j));

我的代码正在运行,但我正在寻找一种正确的方法来使用我的数组元素,因为我将拥有不止 a、b、c

PS:并非所有密钥都会被使用

【问题讨论】:

  • There's no such thing as a "JSON Object" 你拥有的是一个 JavaScript 对象。
  • 数组在哪里?您的预期输出是什么?
  • @phuzi,谢谢你的评论,你能帮忙吗?
  • @AnkitAgarwal 数组是散列,我的预期输出是正确的,但我不想明确命名循环中的每个元素
  • @Jonathan 好的,我已经添加了答案

标签: javascript jquery arrays json dictionary


【解决方案1】:

您可以使用Object.keys,它将为您提供hash 变量中对象的键。然后,您的代码将动态检测Root 对象中的所有可能键:

var j = {
    "Root": {
        "a": "1800,1200,3100",
        "b": "1500,1999,2001",
        "c": "40,60,50",
        "d": "152,199,21",
        "e": "15,19,200"
    }
};
var root = j.Root,
    l = root.a.split(",").length,
    hash = ["a", "b", "c"];


for (var i = 0; i < l; i++) {
    var obj = {};
    for (var x = 0; x < hash.length; x++) {
        obj[hash[x]] = root[hash[x]].split(",")[i];
    }
    root['row_' + i] = obj;
}


for (var x = 0; x < hash.length; x++) {
    delete root[hash[x]];
}
console.log(root);
console.log(JSON.stringify(j));

【讨论】:

  • 问题是我不会使用对象的所有键,我只会使用可以拆分的键
  • @Jonathan 是什么意思
  • @Jonathan 立即查看
  • @Andreas 键不具体。您会看到有一个hash 变量表示只有hash 中的变量需要更改键
  • @Andreas 检查 OP 的要求。他说他只想拥有hash 变量而不是所有的键。因此,可能存在hash 变量与键名相同的情况。
【解决方案2】:

您可以迭代键并构建新属性。

var object = { Root: { a: "1800,1200,3100", b: "1500,1999,2001", c: "40,60,50", d: "this is not needed", e: "nor this one" } },
    reference = object.Root;

Object
    .keys(reference)
    .forEach(k => {
        var values = reference[k].split(',');
        if (values.length === 1) {
            return;
        }
        values.forEach((v, i) => {
            reference['row_' + i] = reference['row_' + i] || {};
            reference['row_' + i][k] = v;
        });        
        delete reference[k];
    });

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

【讨论】:

    【解决方案3】:

    您可以使用以下方法获得所需的结果

    1. reduce()
    2. match()
    3. Object.keys()
    4. Object.values()

    演示

    const root = {
        "Root": {
          "a": "1800,1200,3100",
          "b": "1500,1999,2001",
          "c": "40,60,50",
          "d": "this is not needed",
          "e": "nor this one"
        }
      },
      hash = ["a", "b", "c"],
      keys = Object.keys(root.Root);
    
    
    let result = Object.values(root.Root).reduce((obj, value, index) => {
      if (value.match(',')) {
        value = value.split(',');
        obj[`row_${index}`] = hash.reduce((object, key, index) => {
          object[key] = value[index];
          return object;
        }, {});
      } else {
        obj[keys[index]] = value;
      }
      return obj;
    }, {})
    
    console.log(result);

    【讨论】:

    • d & e 怎么了?
    • @Jonathan 我也包括了de。请检查
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多