对象值被循环上的最后一个值覆盖

时间:2017-11-09 19:39:39

标签: javascript object ecmascript-6

我有以下输入数据:

{
   'a': [1, 2, 3],
   'b': ['x', 'y', 'z'],
   'c': ['a', 'b', 'c'],
}

我正在尝试将以上输入数据更改为以下数据结构:

{ 
  '0': { a: 1, b: 'x', c: 'a' },
  '1': { a: 2, b: 'y', c: 'b' },
  '2': { a: 3, b: 'z', c: 'c' }
} 

我的Javascript代码是:

let parentDataset = {
  'a': [1, 2, 3],
  'b': ['x', 'y', 'z'],
  'c': ['a', 'b', 'c'],
} 

let children = {};
let parent = {};

for (let key in parentDataset) {

  let i = 0;
  for (let value of parentDataset[key]) {        
    children[key] = value;
    parent[i] = children;
    i++;
  }
}

console.log('parent', parent);

但我得到的是输出,其中最后一个值超过了写下前两个值,如下所示:

{ 
  '0': { a: 3, b: 'z', c: 'c' },
  '1': { a: 3, b: 'z', c: 'c' },
  '2': { a: 3, b: 'z', c: 'c' }
}

非常感谢任何解决方案和解释!

5 个答案:

答案 0 :(得分:4)

获取密钥列表后,您可以Array#reduce将一个阵列添加到一系列对象中,并使用Array#forEachObject#assign填充它们:

const obj = {
   'a': [1, 2, 3],
   'b': ['x', 'y', 'z'],
   'c': ['a', 'b', 'c'],
};

const keys = Object.keys(obj);

const result = obj[keys[0]].reduce((r, _, i) => {
  const o = r[i] = {};
  
  keys.forEach((key) => Object.assign(o, { [key]: obj[key][i] }));

  return r;
}, {});

console.log(result);

这是您的代码的工作版本:

const parentDataset = {
  'a': [1, 2, 3],
  'b': ['x', 'y', 'z'],
  'c': ['a', 'b', 'c'],
} 

const parent = {};

for (const key in parentDataset) {
  let i = 0;
  
  for (const value of parentDataset[key]) {        
    !parent[i] && (parent[i] = {}); // create a new object if one is needed
    parent[i][key] = value; // add the key and value to the object
    i++;
  }
}

console.log('parent', parent);

答案 1 :(得分:1)

const input = {
  'a': [1, 2, 3],
  'b': ['x', 'y', 'z'],
  'c': ['a', 'b', 'c']
};

const output = {};

Object.keys(input).forEach( key => {
  input[key].forEach((value,i) => {
    if( !output[i] ){
       output[i] = { [key] : value };
    } else {
       output[i][key] = value;
    }
 });
});

答案 2 :(得分:1)

另一种解决方案是减少对象的值。例如:

const data = {
  'a': [1, 2, 3],
  'b': ['x', 'y', 'z'],
  'c': ['a', 'b', 'c'],
}

const result = Object.values(data).reduce((acc, subarr, idx, arr) => {
  return { ...acc, [idx]: arr.map(sub => sub[idx]) }
}, {})

答案 3 :(得分:1)

要实现此目的,您必须遍历给定的对象键和值。

以下是小代码段:

var data = {
  'a': [1, 2, 3],
  'b': ['x', 'y', 'z'],
  'c': ['a', 'b', 'c'],
};


function addKeys(keys, values, index) {
  var subObj = {}
  for (var i = 0; i < keys.length; i++) {
    subObj[keys[i]] = values[i][index]
  }
  return subObj
}

function returnFinalObject(data) {
  var keys = Object.keys(data)
  var values = Object.values(data)
  var obj = {}
  for (var i = 0; i < keys.length; i++) {
    obj[i] = addKeys(keys, values, i)
  }
  return (obj)
}

var finalObj = returnFinalObject(data)

console.log(finalObj)

希望这有帮助

答案 4 :(得分:1)

https://docs.microsoft.com/en-us/dotnet/api/system.net.httpwebrequest.connection?view=netframework-4.7.2两次:

&#13;
&#13;
var o = {
  'a': [1, 2, 3],
  'b': ['x', 'y', 'z'],
  'c': ['a', 'b', 'c'],
};

var transposed = Object.keys(o).reduce((res, key, i, arr) => {
  res[i] = arr.reduce((row, key) => {
    row[key] = o[key][i];
    return row;
  }, {});
  return res;
}, {});

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