展平字典中的嵌套数组
Posted
技术标签:
【中文标题】展平字典中的嵌套数组【英文标题】:Flatten nested array in dictionary 【发布时间】:2019-03-03 21:32:43 【问题描述】:我有一个包含嵌套数组的字典,比如说
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
我是打字稿的新手,非常需要帮助。
【问题讨论】:
【参考方案1】:更纯粹的方式:
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;
, );
【讨论】:
【参考方案2】:这是一个可以展平嵌套数组的函数(只有一层深度)。循环遍历嵌套数组的所有值并将它们添加为父对象的属性,然后删除嵌套数组。
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"
【讨论】:
【参考方案3】:我认为没有任何自动方式可以做你想做的事,所以只需通过键并手动构建新对象。
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
【讨论】:
以上是关于展平字典中的嵌套数组的主要内容,如果未能解决你的问题,请参考以下文章