Javascript - 基于另一个对象的值映射更新对象键

时间:2018-02-16 19:43:25

标签: javascript

我正在使用两个对象datamap,其中我需要使用data text值来更新map对象的键。 1}}对象基于data的键与datafield对象中map键的值匹配。

data = [{
  1230c9299007b07bf73bb396: "Current",
  5900c9299007b07bf73bb3a0: "Will",
  5900c9299007b07bf73bb39f: "Johnson"
}, {
  1230c9299007b07bf73bb396: "Current",
  5900c9299007b07bf73bb3a0: "Donna",
  5900c9299007b07bf73bb39f: "Sampson"
}, {
  1230c9299007b07bf73bb396: "Past",
  5900c9299007b07bf73bb3a0: "Frank",
  5900c9299007b07bf73bb39f: "Lloyd"
}];

map = [{
  dataField: "1230c9299007b07bf73bb396",
  text: "Customer Type"
}, {
  dataField: "5900c9299007b07bf73bb3a0",
  text: "First Name"
}, {
  dataField: "5900c9299007b07bf73bb39f",
  text: "Last Name"
}];

预期结果:

result = [{
  "Customer Type": "Current",
  "First Name": "Will",
  "Last Name": "Johnson"
}, {
  "Customer Type": "Current",
  "First Name": "Donna",
  "Last Name": "Sampson"
}, {
  "Customer Type": "Past",
  "First Name": "Frank",
  "Last Name": "Lloyd"
}];

我尝试使用以下代码来查找两个对象合并,并且不按预期更新任何对象键:

let items = Object.keys(data).map((key) => {
  const newKey = map[key] || key;
  return { [newKey] : data[key] };
});

3 个答案:

答案 0 :(得分:3)

瞧。

var data = [{
  "1230c9299007b07bf73bb396": "Current",
  "5900c9299007b07bf73bb3a0": "Will",
  "5900c9299007b07bf73bb39f": "Johnson"
}, {
  "1230c9299007b07bf73bb396": "Current",
  "5900c9299007b07bf73bb3a0": "Donna",
  "5900c9299007b07bf73bb39f": "Sampson"
}, {
  "1230c9299007b07bf73bb396": "Past",
  "5900c9299007b07bf73bb3a0": "Frank",
  "5900c9299007b07bf73bb39f": "Lloyd"
}];

var map = [{
  dataField: "1230c9299007b07bf73bb396",
  text: "Customer Type"
}, {
  dataField: "5900c9299007b07bf73bb3a0",
  text: "First Name"
}, {
  dataField: "5900c9299007b07bf73bb39f",
  text: "Last Name"
}];  


let items = data.map(object => {
  let newObj = {};
  map.forEach(prop => newObj[prop.text] = object[prop.dataField]);
  return newObj;
});

console.log(items);

希望答案

答案 1 :(得分:2)

你走了:



const pre = document.getElementById('pre');

const data = [{
    '1230c9299007b07bf73bb396': "Current",
    '5900c9299007b07bf73bb3a0': "Will",
    '5900c9299007b07bf73bb39f': "Johnson"
  },
  {
    '1230c9299007b07bf73bb396': "Current",
    '5900c9299007b07bf73bb3a0': "Donna",
    '5900c9299007b07bf73bb39f': "Sampson"
  },
  {
    '1230c9299007b07bf73bb396': "Past",
    '5900c9299007b07bf73bb3a0': "Frank",
    '5900c9299007b07bf73bb39f': "Lloyd"
  }
];

const map = [{
  dataField: "1230c9299007b07bf73bb396",
  text: "Customer Type"
}, {
  dataField: "5900c9299007b07bf73bb3a0",
  text: "First Name"
}, {
  dataField: "5900c9299007b07bf73bb39f",
  text: "Last Name"
}];

const fieldToText = map.reduce((result, el) => {
  result[el.dataField] = el.text;
  return result
}, []);

const result = data.map((el) => {
  return Object.entries(el).reduce((result, [key, value]) => {
    result[fieldToText[key]] = value;
    return result;
  }, {});
});

pre.innerHTML = JSON.stringify(result, null, 2);

<pre id="pre"></pre>
&#13;
&#13;
&#13;

https://jsfiddle.net/oniondomes/gqgkroux/

答案 2 :(得分:0)

首先建立一个数字 - 关键地图:

  const keys = new Map(map.map({dataField, text}) => ([dataField, text])));

现在,您可以通过迭代构建新对象的所有键值对来将每个数据条目映射到新对象:

  const result = data.map(obj => {
    const tmp = {};
    for(const [key, value] of Object.entries(obj)){
      tmp[keys.get(key) || "_"] = value;
    }
    return tmp;
 });