如何在javascript

时间:2017-11-23 17:44:14

标签: javascript arrays json mapping

我有一个这样的对象和数组,我从服务器收到了响应。我需要将其转换为下面的第二种格式,以便在网站上打印该值。这是需要做对象映射的吗?或解析JSON或请帮助。

{"header":["SEOUL","BUSAN","NAMPODONG"],"data":[[38,"CAPITAL","M31"]]}

从上方转换为

'{"SEOUL" : "38", "BUSAN" : "CAPITAL", "NAMPODONG" : "M31"}'

var finalObj = {};
response.header.forEach(function(item, index) {
finalObj[item] = response.data[0][index];
});

上面的代码工作正常,因为它为header创建变量和循环并获取其值并以html格式打印。标题和数据来自服务器,所以当我输入一些东西时说“A”然后它会查找SEOUL标题然后在html中打印38,因为表格如下所示。

键值:A

标题:SEOUL BUSAN NAMPODONG

数据:38 CAPITAL M31

我在数据库中确实有很多数据,上面只是一个例子。所以,让我说我输入B然后B不在数据库中,所以我想在html中看到值“No found”但是这段代码没有打印,所以不确定它是否继续。

6 个答案:

答案 0 :(得分:3)

创建变量&循环遍历object.header以获取每个密钥,object.data[0]获取其值

var myObj = {
  "header": ["SEOUL", "BUSAN", "NAMPODONG"],
  "data": [
    [38, "CAPITAL", "M31"]
  ]
}
var tempObj = {};
myObj.header.forEach(function(item, index) {
  tempObj[item] = myObj.data[0][index]


})
console.log(tempObj)

答案 1 :(得分:2)

当你从服务器收到它时 - 我认为它是JSON字符串。

基本上你在这里有两个数组,你想reduce到一个对象。 所以我会这样做:

const object = JSON.parse('{"header":["SEOUL","BUSAN","NAMPODONG"],"data":[[38,"CAPITAL","M31"]]}');

const result = object.header.reduce(function(accumulator, element, i){
  accumulator[element] = object.data[0][i] // You had nested array here so I have to get first element.
  return accumulator;
}, {});
console.log(result);

我认为data属性的嵌套数组是某种格式错误。如果不是 - 你必须先map尽管它是元素,然后才减少。

答案 2 :(得分:2)

您可以使用Ramda库中的zipObj

代码如下所示:

const res = {"header":["SEOUL","BUSAN","NAMPODONG"],"data":[[38,"CAPITAL","M31"]]}

const obj = R.zipObj(res.header, res.data[0])
console.log(obj)
<script src="//cdn.jsdelivr.net/npm/ramda@latest/dist/ramda.min.js"></script>

答案 3 :(得分:0)

您可以使用想要的键映射新对象。

结果是一个包含对象的数组,因为您的数据是一个嵌套数组,实际上只有一个数组。但看起来taht数据可能包含多行。

&#13;
&#13;
var data = { header: ["SEOUL", "BUSAN", "NAMPODONG"], data: [[38, "CAPITAL", "M31"]] },
    result = data.data.map(a => Object.assign(...data.header.map((k, i) => ({ [k]: a[i] }))));

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

答案 4 :(得分:0)

您可以使用data数组中的字符串作为键,将header数组数组映射到另一个对象数组中:

&#13;
&#13;
function transform(obj) {
  return obj.data.map(function(subArray) {             // for each subArray in the data array
    return subArray.reduce(function(o, val, i) {       // create a new object o which...
      o[ obj.header[i] ] = val;                        // has key-value pairs where value is the current element of subArray and key is its equivalent (item at the same index) from header array
      return o;
    }, {});
  });
}


var obj = {"header":["SEOUL","BUSAN","NAMPODONG"],"data":[[38,"CAPITAL","M31"], [10,"OTHER","M01"]]};
var result = transform(obj);

console.log(result);
&#13;
&#13;
&#13;

答案 5 :(得分:0)

我认为上面的回答很好,但是如果你不了解它,这里有一个替代方法

&#13;
&#13;
var response = {
  "header": ["SEOUL", "BUSAN", "NAMPODONG"],
  "data": [
    [38, "CAPITAL", "M31"]
  ]
};

var result = response.header.reduce(function(accum, v, i) {
    accum[v] = response.data[0][i];
    return accum;
}, {})

console.log(result)
&#13;
&#13;
&#13;