如何在JSON对象中组合多个键值?

6

我有一个示例JSON对象:

var sample = [{
    "label": "one",
    "value": 1
}, {
    "label": "two",
    "value": 2
}, {
    "label": "three",
    "value": 3
}, {
    "label": "four",
    "value": 4
}, {
    "label": "five",
    "value": 5
}];

我希望将其改变成类似这样的形式。

var sample = [{
    "label": "one",
    "value": 1,
    "newKeyValue": "one|1"
}, {
    "label": "two",
    "value": 2,
    "newKeyValue": "two|2"
}, {
    "label": "three",
    "value": 3,
    "newKeyValue": "three|3"
},
...
];

它应该结合两个关键值并返回组合后的新关键值。

JSON是动态的关键标签和值不是静态的,它可以是任何东西。例如 [{"name":"srinivas","lastname":"pai"}]


尝试使用$.extend(targetSample, Sample) - Parth Trivedi
@Tushar 没有尝试过。 - Shrinivas Pai
我尝试使用for循环,但只能添加单个值@Tushar。 - Shrinivas Pai
你提出问题的方式似乎有点混乱。我建议添加一句话,即实际的键不是静态的,可能会随时间而变化,就像你在一些评论中已经做过的那样。 - T3 H40
你如何保持键的顺序? - Nina Scholz
6个回答

4
你可以像这样使用 map:

编辑

处理通用键时,你可以使用Object.keys(d)[0]来获取第一个键, Object.keys(d)[1]来获取第二个键。

var sample = [

     {
      "label":"one",
      "value":1
     },

     {
      "label":"two",
      "value":2
     },
     {
      "label":"three",
      "value":3
     },
     { 
      "label":"four",
      "value":4
     },
     { 
      "label":"five",
      "value":5
      }

     ];
    var data = sample.map(function(d){
     return {label: Object.keys(d)[0], value: Object.keys(d)[1], newKeyValue:  Object.keys(d)[0] +"|" + Object.keys(d)[1]}
    }) 
    console.log(data)

希望这可以帮到你!

感谢您的快速回复。JSON是动态生成的,键标签和值不是静态的,可以是任何内容。例如[{"name":"srinivas","lastname":"pai"}]。 - Shrinivas Pai
请检查编辑部分,您也可以通用地这样做。 - Cyril Cherian

3
您可以使用 Array#map()Object.keys()Array#join() 来处理 IT 技术相关内容。
在 ES6 中,您还可以使用 箭头函数
sample = sample.map(obj => {
    var keys = Object.keys(obj);
    obj.newKeyValue = keys.map(key => obj[key]).join('|');
    return obj;
});

var sample = [{
    "label": "one",
    "value": 1
}, {
    "name": "two",
    "age": 2
}, {
    "five": "three",
    "six": 3
}, {
    "company": "four",
    "organization": 4
}, {
    "label": "five",
    "value": 5
}];

sample = sample.map(function (x) {
    var keys = Object.keys(x);
    x.newKeyValue = keys.map(key => x[key]).join('|');
    return x;
});
console.log(sample);
document.body.innerHTML = '<pre>' + JSON.stringify(sample, 0, 4) + '</pre>';

在ES5中,您可以使用匿名函数来编写相同的代码。
sample = sample.map(function (obj) {
    var keys = Object.keys(obj);
    obj.newKeyValue = keys.map(function (key) {
        return obj[key]
    }).join('|');
    return obj;
});

因动态键而产生的限制:

  1. 对象中键的顺序无法保持
  2. 这将连接对象中所有可用的键(如果您只想连接较少的键

谢谢@tushar,JSON是动态生成的,键标签和值不是静态的,可以是任何内容。例如[{"name":"srinivas","lastname":"pai"}]。 - Shrinivas Pai
@SrinivasPai,您能在问题中添加更多详细信息吗? - Tushar
@SrinivasPai 我已经更新了答案,使键变为动态的。请再次检查。另外请注意,如果对象包含多个键,则会使用 | 作为分隔符将它们全部连接起来。 - Tushar
一行代码:sample = sample.map(obj => Object.assign(obj, { newKeyValue: Object.keys(obj).map(key => obj[key]).join('|') })); - Tushar

2

var sample = [

         {
          "label":"one",
          "value":1
         },

         {
          "label":"two",
          "value":2,
          "optionalValue":2
         },
         {
          "label":"three",
          "value":3,
          "remarks":"free text"
         },
         { 
          "label":"four",
          "value":4
         },
         { 
          "label":"five",
          "value":5
          }

         ];

    for (var key in sample) {
      var newValue = [];
      for (var piece in sample[key]){
        newValue.push(sample[key][piece])
      }
      sample[key]["newKeyValue"] = newValue.join('|');
    }

    $('pre').html(JSON.stringify(sample,null,4));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre></pre>


1
你可以使用Array.prototype.forEach()进行原地修改。

forEach()方法对数组的每个元素执行一次提供的函数。

编辑:使用存储在数组中的动态键,因为顺序可能会改变。

var sample = [{ "label": "one", "value": 1 }, { "label": "two", "value": 2 }, { "label": "three", "value": 3 }, { "label": "four", "value": 4 }, { "label": "five", "value": 5 }];

sample.forEach(function (a) {
    a.newKeyValue = ['label', 'value'].map(function (k) { return a[k]; }).join('|');
});

document.write('<pre>' + JSON.stringify(sample, 0, 4) + '</pre>');


0

如果有更多的元素,则使用{{link1:$.extend}}

var sample = [

         {
          "label":"one",
          "value":1
         },

         {
          "label":"two",
          "value":2
         },
         {
          "label":"three",
          "value":3
         },
         { 
          "label":"four",
          "value":4
         },
         { 
          "label":"five",
          "value":5
          }

         ];
        $(sample).each(function(i,item){
            var keyes = Object.keys(item);
            sample[i] =  $.extend(item,{newKeyValue: item[keyes[0]] +"|" +item[keyes[1]]});
        });
       
        console.log(sample)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

$.extend 在你需要合并多个对象时非常有用,特别是当你已经拥有多个对象并且想要将它们合并在一起时。例如:

  var base  = {
          "label":"one",
          "value":1
         }

如果你想要添加更多的对象

 var extra  =  {
          "new1":"value1",
          "new2":"value2",
          "new3":"value3",
          "new4":"value4",
       }

然后它将由完成

$.extend(base,extra);

输出:

        {
              "label":"one",
              "value":1,
              "new1":"value1",
              "new2":"value2",
              "new3":"value3",
              "new4":"value4",
         }

0
var sample = [{"name":"srinivas","lastname":"pai"}];    

sample.map(function(item) {
  item.newKeyValue = Object.getOwnPropertyNames(item).map(function(d) {return item[d];}).join("|");
})

    console.log(sample);

JSON是动态生成的,键标签和值不是静态的,可以是任何内容。例如[{"name":"srinivas","lastname":"pai"}]。 - Shrinivas Pai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接