展平字典中的嵌套数组
Flatten nested array in dictionary
我有一个有嵌套数组的字典,比方说
let data = {"date" : "01.01.2017", "foo":["mama", "papa", "sister", "brother"]};
现在,我需要(想要)使 'foo' 数组成为字典的一部分,以便 'data' 看起来像:
let newData = {"date" : "01.01.2017", "foo_1":"mama", "foo_2":"papa", "foo_3":"sister", "foo_4":"brother"};
我用谷歌搜索并找到了一些解决方案,这些解决方案与主题相近,但不完全是我需要的:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap
https://gist.github.com/ArtemAvramenko/d92c92ff1b74cbc55be226dcabff90cc
Flattening a Javascript dictionary, preserving the nested keys
我是打字稿的新手,真的很想得到一些帮助。
我不认为有任何自动方法可以做你想做的事,所以只需通过键并手动构建新对象。
let newData = {date: data.date}
data.foo.forEach((value, index) => {
newData["foo_"+(index+1)] = value
})
这是一种更通用的方法,以防您的数据变化更大。这只是循环遍历原始对象中的所有键,如果它们是数组,则类似于您的示例将它们展平,如果不是,则直接复制它们。
function flattenKeys (data) {
let newData = {}
Object.keys(data).forEach(key =>
if (Array.isArray(data[key])) {
data[key].forEach((value, index) => {
// build a new set of keys based on the name of the original
newData[key + "_" + (index+1)] = value
})
} else {
newData[key] = data[key]
}
}
return newData
}
这是一个可以展平嵌套数组(只有一层深)的函数。遍历嵌套数组的所有值并将它们添加为父对象的属性,然后删除嵌套数组。
let data = {"date": "01.01.2017", "foo": ["mama", "papa", "sister", "brother"]};
function flattenNested(obj: Object) {
for (let prop in obj) {
if (obj[prop] instanceof Array) {
obj[prop].forEach((val, index) => {
obj[prop + '_' + (index + 1)] = val;
});
delete obj[prop];
}
}
return obj;
}
console.log(flattenNested(data));
// { date: "01.01.2017", foo_1: "mama", foo_2: "papa", foo_3: "sister", foo_4: "brother" }
更纯粹的方式:
Object.entries(data)
.reduce((result, entry) => {
const [key, value] = entry;
if (Array.isArray(value))
value.forEach((v, i) => result[`${key}_${i}`] = v);
else
result[key] = value;
return result;
}, {});
我有一个有嵌套数组的字典,比方说
let data = {"date" : "01.01.2017", "foo":["mama", "papa", "sister", "brother"]};
现在,我需要(想要)使 'foo' 数组成为字典的一部分,以便 'data' 看起来像:
let newData = {"date" : "01.01.2017", "foo_1":"mama", "foo_2":"papa", "foo_3":"sister", "foo_4":"brother"};
我用谷歌搜索并找到了一些解决方案,这些解决方案与主题相近,但不完全是我需要的: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap
https://gist.github.com/ArtemAvramenko/d92c92ff1b74cbc55be226dcabff90cc
Flattening a Javascript dictionary, preserving the nested keys
我是打字稿的新手,真的很想得到一些帮助。
我不认为有任何自动方法可以做你想做的事,所以只需通过键并手动构建新对象。
let newData = {date: data.date}
data.foo.forEach((value, index) => {
newData["foo_"+(index+1)] = value
})
这是一种更通用的方法,以防您的数据变化更大。这只是循环遍历原始对象中的所有键,如果它们是数组,则类似于您的示例将它们展平,如果不是,则直接复制它们。
function flattenKeys (data) {
let newData = {}
Object.keys(data).forEach(key =>
if (Array.isArray(data[key])) {
data[key].forEach((value, index) => {
// build a new set of keys based on the name of the original
newData[key + "_" + (index+1)] = value
})
} else {
newData[key] = data[key]
}
}
return newData
}
这是一个可以展平嵌套数组(只有一层深)的函数。遍历嵌套数组的所有值并将它们添加为父对象的属性,然后删除嵌套数组。
let data = {"date": "01.01.2017", "foo": ["mama", "papa", "sister", "brother"]};
function flattenNested(obj: Object) {
for (let prop in obj) {
if (obj[prop] instanceof Array) {
obj[prop].forEach((val, index) => {
obj[prop + '_' + (index + 1)] = val;
});
delete obj[prop];
}
}
return obj;
}
console.log(flattenNested(data));
// { date: "01.01.2017", foo_1: "mama", foo_2: "papa", foo_3: "sister", foo_4: "brother" }
更纯粹的方式:
Object.entries(data)
.reduce((result, entry) => {
const [key, value] = entry;
if (Array.isArray(value))
value.forEach((v, i) => result[`${key}_${i}`] = v);
else
result[key] = value;
return result;
}, {});