如何转换对象数组?

时间:2016-07-19 01:42:35

标签: javascript

我有对象数组

[
    {
        "store_name":"ABC",
        "store_iput": "123",
        "store_Amount": "34"
    },
    {
        "store_name":"XYZ",
        "store_iput": "178",
        "store_Amount": "346"
    },
    {
        "store_name":"Tokr",
        "store_iput": "3",
        "store_Amount": "3"
    }
]

所有三个对象都具有相同的键但具有不同的值。所以我只想要具有所有值的键。

{
    "store_name":["ABC","XYZ","Tokr"],
    "store_input":["123","178","3"],
    "store_Amount":["34","346","3"]
}

如何获得此输出?

10 个答案:

答案 0 :(得分:2)

简要方法

let result={};
Object.keys(array[0]).forEach((key)=>{
           result[key]=array.map((e)=> e[key]);
})

DEMO

答案 1 :(得分:1)

如果我理解你,最简单的方法是将所有值存储在数组中。

例如,您可以使用for循环:

var i, store_name, store_input, store_Amount, array;

array = [
    {
        "store_name":"ABC",
        "store_iput": "123",
        "store_Amount": "34"
    },
    {
        "store_name":"XYZ",
        "store_iput": "178",
        "store_Amount": "346"
    },
    {
        "store_name":"Tokr",
        "store_iput": "3",
        "store_Amount": "3"
    }
]

for(i=0;i<array.length;i++){
    store_name[i]=array[i].store_name;
    store_input[i]=array[i].store_name;
    store_Amount[i]=array[i].store_name;
}

而且,您获得3个值数组 - 商店名称,商店输入和商店数量。

如果您决定将所有值存储在一个对象中,则可以执行以下操作而不是之前的for循环:

var obj = {
    var store_name = [],
        store_input= [],
        store_Amount = [];
};

for(i=0;i<array.length;i++){
    obj.store_name[i]=array[i].store_name;
    obj.store_input[i]=array[i].store_name;
    obj.store_Amount[i]=array[i].store_name;
}

答案 2 :(得分:0)

以下是一种方法:

&#13;
&#13;
var input = [
  { "store_name": "ABC", "store_iput": "123", "store_Amount": "34" },
  { "store_name": "XYZ", "store_iput": "178", "store_Amount": "346" },
  { "store_name": "Tokr", "store_iput": "3", "store_Amount": "3" }
];

var output = input.reduce(function(a, v) {
  Object.keys(v).forEach(function(k) { (a[k] || (a[k] = [])).push(v[k]); });
  return a;
}, {});

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

进一步阅读:

答案 3 :(得分:0)

您可以使用Object.keys获取数组第一个对象中的键名称,然后使用Array#map迭代此数组,以获取所有对象的映射值,并添加每个键的新对象的映射值:

var keys = Object.keys(objectArray[0]);
var combinedObject = {};
keys.forEach(function(key){
    combinedObject[key] = objectArray.map(function(object){
        return object[key];
    });
})

答案 4 :(得分:0)

(function(arr) {
  var rtn = {};
  for (var i = 0; i < arr.length; i++) {
    for (var k in arr[i]) {
      if (rtn[k]) {
        rtn[k].push(arr[i][k]);
      } else {
        rtn[k] = [arr[i][k]];
      }
    }
  }
  console.log(rtn)
  return rtn;

})([{
  "store_name": "ABC",
  "store_iput": "123",
  "store_Amount": "34"
}, {
  "store_name": "XYZ",
  "store_iput": "178",
  "store_Amount": "346"
}, {
  "store_name": "Tokr",
  "store_iput": "3",
  "store_Amount": "3"
}]);

答案 5 :(得分:0)

只需迭代数组项。对于每一个,获取其属性并迭代它们。使用该属性作为在结果中存储数据的关键字。如果密钥不存在,请创建一个新数组。

&#13;
&#13;
var data = [
  {
    "store_name":"ABC",
    "store_iput": "123",
    "store_Amount": "34"
  },
  {
    "store_name":"XYZ",
    "store_iput": "178",
    "store_Amount": "346"
  },
  {
    "store_name":"Tokr",
    "store_iput": "3",
    "store_Amount": "3"
  }
];
console.log(data.reduce(function(result, item, index) {
  Object.keys(item).forEach(function(key) {
    if(!result.hasOwnProperty(key)) result[key] = new Array(data.length);
    result[key][index] = item[key];
  });
  return result;
}, {}));
&#13;
&#13;
&#13;

答案 6 :(得分:0)

此问题有多种方法,如其他人所列。

如果您正在尝试使用ECMA5语法解决问题,那么您可以使用reduce

示例:

var test =
[
    {
        "store_name":"ABC,",
        "store_input": "123",
        "store_Amount": "34"
    },
    {
        "store_name":"XYZ",
        "store_input": "178",
        "store_Amount": "346"
    },
    {
        "store_name":"Tokr",
        "store_input": "3",
        "store_Amount": "3"
    }
];

let output = test.reduce((accumulator, current) => {
    accumulator.store_name.push(current.store_name);
    accumulator.store_input.push(current.store_input);
    accumulator.store_Amount.push(current.store_Amount);
    return accumulator
}, {
    "store_name" : [],
    "store_input" : [],
    "store_Amount" : []
});

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

<强>输出:

{
    "store_name":["ABC,","XYZ","Tokr"],
    "store_input":["123","178","3"],
    "store_Amount":["34","346","3"]
}

基本上代码正在做的是它试图使用你的JSON对象test并将其缩减为一个用键填充的单个对象; store_namestore_inputstore_amount。其中每个人都有一个阵列。请参阅reduce的第二个参数。

然后,对于reduce API中的每次迭代,代码将从current检索适当的属性,并将其值推送到正确的数组中。它一直持续到迭代结束。

您可能还想查看reduce的其他用法。

查看:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

答案 7 :(得分:0)

如果您事先知道所有钥匙,那就很容易了。

var data = {
   store_name:[],
   store_input:[],
   store_Amount:[]
}

items.forEach(function(el, i, arr){
   data.store_name.push(el.store_name);
   data.store_input.push(el.store_input);
   data.store_Amount.push(el.store_Amount);       
} 
// or
items.forEach(function(el, i, arr){
   Object.keys(el).forEach(function(key) {
       data[key].push(el[key]);
   });       
} 

如果您需要考虑新密钥或缺失密钥,那么您需要动态地将密钥添加到数据对象,然后发布进程以根据需要同步密钥数组长度

var data = {};
items.forEach(function(el, i, arr){
    Object.keys(el).forEach(function(key) {
       var arr = data[key] || [];
       arr[i] = el[key]; // set to i to account for missing values
       data[key] = arr;
    }
}
// resize any short arrays
// fill in missing data?
Object.keys(data).forEach(function(key){
    data[key].length = items.length;
});

答案 8 :(得分:0)

没有直接的方法来实现所需的输出。 你需要做一些计算来实现它。尝试使用以下内容:

var arr = [{"store_name":"ABC", "store_iput": "123", "store_Amount": "34" }, {"store_name":"XYZ", "store_iput": "178", "store_Amount": "346"}, {"store_name":"Tokr", "store_iput": "3", "store_Amount": "3"}]
var result= {};
for (var i = 0; i < arr.length; i++) {
    var obj = arr[i];
    for (var prop in obj) {
        if (result[prop] == null) {
            result[prop] = [];
            result[prop].push(obj[prop]);
        } else {
            result[prop].push(obj[prop]);
        }
    }
}

for (var prop in result) {
    // you need to use print statement to print key and value
}

答案 9 :(得分:0)

var final = {store_name: [], store_iput: [], store_Amount: []}
var original = [
    {
        "store_name":"ABC",
        "store_iput": "123",
        "store_Amount": "34"
    },
    {
        "store_name":"XYZ",
        "store_iput": "178",
        "store_Amount": "346"
    },
    {
        "store_name":"Tokr",
        "store_iput": "3",
        "store_Amount": "3"
    }
]

original.forEach(function(x){
    final.store_name.push(x.store_name)
    final.store_iput.push(x.store_iput)
    final.store_Amount.push(x.store_Amount)
})

https://repl.it/CdX5/1