将JS Array中的键值对减少为object

时间:2016-08-09 14:59:15

标签: javascript arrays

我有一个对象,我必须分成两个数组来正确处理。 它看起来像这样:

{
  city:"stuttgart",
  street:"randomstreet",
  ...
}

由于它需要符合某个指令,我必须将其转换为:

[
  {key:"city", value:"stuttgart"}
  {key:"street", value:"randomstreet"},
  ...
]

为此我首先使用

var mapFromObjectWithIndex = function (array) {
  return $.map(array, function(value, index) {
    return [value];
  });
};

var mapFromObjectWithValue = function (array) {
  return $.map(array, function(value, index) {
    return [index];
  });
});

创建两个数组,一个包含旧键,另一个包含旧值。然后我创建了另一个二维数组,将它们映射到一个执行此

的数组中
var mapToArray = function (arrayValue, arrayIndex) {
  var tableData = [];
  for (var i = 0; i<arrayIndex.length; i++){
    tableData[i] = {key:arrayIndex[i] , value:arrayValue[i]};
  }
  return tableData;
};

(也许我已经搞砸了,这可以更容易吗?)

现在,我使用数组(tableData)来显示表单中的数据。可以编辑值字段。最后,我想将数组(tableData)转换为原始数组。 (见第一个对象)

请注意,原始对象不仅包含字符串作为值,但也可以包含对象。

4 个答案:

答案 0 :(得分:8)

我认为转换肯定更容易:

&#13;
&#13;
var obj = {
  city:"stuttgart",
  street:"randomstreet",
};

var tableData = Object.keys(obj).map(k => {return {key: k, value: obj[k]}});

console.log(tableData);

var dataBack = {};
tableData.forEach(o => dataBack[o.key] = o.value);

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

你想用对象做什么?你想扩展它们吗?如果是,你可以做这样的事情(它也适用于嵌套对象):

&#13;
&#13;
var obj = {
  city:"stuttgart",
  street:"randomstreet",
  obj: {a: 'a', b: 'b'},
  subObject: {aha: {z: 'z', y: 'y'}}
};

function trasformToTableData(obj) {
  if (typeof obj !== 'object') return obj;
  return Object.keys(obj).map(k => {return {key: k, value: trasformToTableData(obj[k])}});
}

var tableData = trasformToTableData(obj);
console.log(tableData);

function transformBack(obj) {
  if (Array.isArray(obj)) {
    var support ={};
    for (let i = 0; i < obj.length; i++) {
      support[obj[i].key] = transformBack(obj[i].value)
    }
    return support;
  }
  return obj;
}

var dataBack = {};
tableData.forEach(o => dataBack[o.key] = transformBack(o.value));

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

答案 1 :(得分:3)

让我们玩得开心,将我们的对象变成可迭代的,按照以下方式完成工作;

var input = {city:"stuttgart", street:"randomstreet", number: "42"};
   output = [];
input[Symbol.iterator] = function*(){
                           var ok = Object.keys(this),
                                i = 0;
                           while (i < ok.length) yield {key : ok[i], value: this[ok[i++]]};
                         };
output = [...input];
console.log(output);

答案 2 :(得分:2)

当您使用objVar.mapToArray()Object.keys()

调用.map()时,此功能会将您的对象映射到数组
Object.prototype.mapToArray = function() {
  return Object.keys(this).map(function(v) {
    return { key: v, value: this[v] };
  }.bind(this));
}

答案 3 :(得分:1)

我会做这样的事情:

&#13;
&#13;
var dataObj = {
  city:"stuttgart",
  street:"randomstreet",
};

function toKeyValue(obj) {
  var arr = [];
  for (var key in obj) {
    if(obj.hasOwnProperty(key)) {
      arr.push({'key': key, 'value': obj[key]});
    }
  }
  return arr;
}

var arrayKeyValue = toKeyValue(dataObj);
console.log(arrayKeyValue);
&#13;
&#13;
&#13;