重命名对象中的一些键
Rename some keys in an object
我有一个包含多个键和值的对象。
我只想重命名一些键而不是全部。对于我所做的,它不会返回对象中的其余键值对:
data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"};
keyMap = {key1: "firstkey", key2: "secondkey"};
mappedData = Object.keys(keyMap).reduce((obj,k) => Object.assign(obj, { [keyMap[k]]: data[k] }),{});
console.log(mappedData);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
如何返回:
{
firstkey: "value1",
secondkey: "value2",
key3: "value3",
key4: "value4"
}
您可以通过检查 keyMap
获取条目并替换密钥,然后获取新密钥或使用旧密钥。
let data = { key1: "value1", key2: "value2", key3: "value3", key4: "value4" };
keyMap = { key1: "firstkey", key2: "secondkey" },
mappedData = Object.fromEntries(
Object
.entries(data)
.map(([key, value]) => [key in keyMap ? keyMap[key] : key, value])
);
console.log(mappedData);
也许是这样的:
const changeKeys = (keyMap) => (obj) =>
Object .fromEntries (Object .entries (obj) .map (([k, v]) => [keyMap[k] || k, v]))
const data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"};
const keyMap = {key1: "firstkey", key2: "secondkey"};
console .log(
changeKeys (keyMap) (data)
)
将 Object.entries
和 Object.fromEntries
与 map
或中间的其他转换一起使用可以解决各种对象操作问题。
如果 Object.fromEntries
is not available 适合您的环境,则很容易填充。
您可以使用 for 循环一次完成
data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"};
keyMap = {key1: "firstkey", key2: "secondkey"};
const isDefined = x => typeof x !== 'undefined'
const renameKeys = o => {
const newObj = {}
for (const key in o) {
if (isDefined(keyMap[key])) {
newObj[keyMap[key]] = o[key]
} else {
newObj[key] = o[key]
}
}
return newObj
}
console.log(
renameKeys(data)
)
我会遍历数据并查看是否存在密钥。如果确实使用它,如果不使用原始密钥。
var data = {
key1: "value1",
key2: "value2",
key3: "value3",
key4: "value4"
};
var keyMap = {
key1: "firstkey",
key2: "secondkey"
};
const updated = Object.entries(data).reduce((obj, [key, value]) => {
const updatedKey = keyMap[key] || key
obj[updatedKey] = value
return obj
}, {})
console.log(updated);
这是您的代码,稍作更新:
data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"};
keyMap = {key1: "firstkey", key2: "secondkey"};
mappedData = Object.keys(data).reduce((obj,k) => Object.assign(obj, { [keyMap[k] || k]: data[k] }),{});
console.log(mappedData);
问题是您的 reduce
函数中的累加器是一个新的空对象,您只是迭代要更改的键。
有很多方法可以完成您想要做的事情。我个人发现 reduce
难以解析,所以我会跳过它并执行如下操作:
const data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"};
const keyMap = {key1: "firstkey", key2: "secondkey"};
const mappedData = {};
for(const key of Object.keys(data)){
// Use the renamed key if it exists, else fall back on the original key
mappedData[ keyMap[key] || key ] = data[ key ];
}
console.log(mappedData);
如果您真的想这样做,您可以将相同类型的逻辑应用于 reduce
,方法是遍历原始数据而不是键盘映射:
const data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"};
const keyMap = {key1: "firstkey", key2: "secondkey"};
mappedData = Object.keys(data).reduce((obj,k) => Object.assign(obj, { [keyMap[k] || k]: data[k] }),{});
console.log(mappedData);
我有一个包含多个键和值的对象。
我只想重命名一些键而不是全部。对于我所做的,它不会返回对象中的其余键值对:
data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"};
keyMap = {key1: "firstkey", key2: "secondkey"};
mappedData = Object.keys(keyMap).reduce((obj,k) => Object.assign(obj, { [keyMap[k]]: data[k] }),{});
console.log(mappedData);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
如何返回:
{
firstkey: "value1",
secondkey: "value2",
key3: "value3",
key4: "value4"
}
您可以通过检查 keyMap
获取条目并替换密钥,然后获取新密钥或使用旧密钥。
let data = { key1: "value1", key2: "value2", key3: "value3", key4: "value4" };
keyMap = { key1: "firstkey", key2: "secondkey" },
mappedData = Object.fromEntries(
Object
.entries(data)
.map(([key, value]) => [key in keyMap ? keyMap[key] : key, value])
);
console.log(mappedData);
也许是这样的:
const changeKeys = (keyMap) => (obj) =>
Object .fromEntries (Object .entries (obj) .map (([k, v]) => [keyMap[k] || k, v]))
const data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"};
const keyMap = {key1: "firstkey", key2: "secondkey"};
console .log(
changeKeys (keyMap) (data)
)
将 Object.entries
和 Object.fromEntries
与 map
或中间的其他转换一起使用可以解决各种对象操作问题。
如果 Object.fromEntries
is not available 适合您的环境,则很容易填充。
您可以使用 for 循环一次完成
data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"};
keyMap = {key1: "firstkey", key2: "secondkey"};
const isDefined = x => typeof x !== 'undefined'
const renameKeys = o => {
const newObj = {}
for (const key in o) {
if (isDefined(keyMap[key])) {
newObj[keyMap[key]] = o[key]
} else {
newObj[key] = o[key]
}
}
return newObj
}
console.log(
renameKeys(data)
)
我会遍历数据并查看是否存在密钥。如果确实使用它,如果不使用原始密钥。
var data = {
key1: "value1",
key2: "value2",
key3: "value3",
key4: "value4"
};
var keyMap = {
key1: "firstkey",
key2: "secondkey"
};
const updated = Object.entries(data).reduce((obj, [key, value]) => {
const updatedKey = keyMap[key] || key
obj[updatedKey] = value
return obj
}, {})
console.log(updated);
这是您的代码,稍作更新:
data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"};
keyMap = {key1: "firstkey", key2: "secondkey"};
mappedData = Object.keys(data).reduce((obj,k) => Object.assign(obj, { [keyMap[k] || k]: data[k] }),{});
console.log(mappedData);
问题是您的 reduce
函数中的累加器是一个新的空对象,您只是迭代要更改的键。
有很多方法可以完成您想要做的事情。我个人发现 reduce
难以解析,所以我会跳过它并执行如下操作:
const data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"};
const keyMap = {key1: "firstkey", key2: "secondkey"};
const mappedData = {};
for(const key of Object.keys(data)){
// Use the renamed key if it exists, else fall back on the original key
mappedData[ keyMap[key] || key ] = data[ key ];
}
console.log(mappedData);
如果您真的想这样做,您可以将相同类型的逻辑应用于 reduce
,方法是遍历原始数据而不是键盘映射:
const data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"};
const keyMap = {key1: "firstkey", key2: "secondkey"};
mappedData = Object.keys(data).reduce((obj,k) => Object.assign(obj, { [keyMap[k] || k]: data[k] }),{});
console.log(mappedData);