[英]React – Create array from arrays in Objects
Beginner React/JS question here.初学者 React/JS 问题在这里。 I have a series of entries (form submissions) that each contain arrays of languages like so:
我有一系列条目(表单提交),每个条目都包含 arrays 语言,如下所示:
0: {…}
dream: Array [ "Bengali", "French" ]
feel: Array [ "Arabic", "English" ]
speak: Array [ "Afrikaans", "Armenian" ]
think: Array [ "Albanian" ]
1: {…}
dream: Array [ "English", "French" ]
feel: Array [ "German", "Italian" ]
speak: Array [ "Afrikaans", "English" ]
think: Array [ "Cantonese" ]
I want an array of all languages in each category.我想要每个类别中所有语言的数组。 I understand that I have to filter through each entry and save the languages, but I don't know how to check for duplicates.
我知道我必须过滤每个条目并保存语言,但我不知道如何检查重复项。
Currently, I can filter to view entries a single language using目前,我可以使用过滤器查看单一语言的条目
setFilter(entries.filter((key) => key.speak.includes("Afrikaans")));
but I can't figure out how to create a master list of all languages.但我不知道如何创建所有语言的主列表。
is this what you want?这是你想要的吗? you need to reduce and filter du avoid duplicates,you will have an object as result
您需要减少和过滤以避免重复,结果您将获得 object
const myArray = [{ dream: [ "Bengali", "French" ], feel: [ "Arabic", "English" ], speak: [ "Afrikaans", "Armenian" ], think: [ "Albanian" ] },{ dream: [ "Bengaslis", "French" ], feel: [ "Arabsic", "English" ], speak: [ "Afrikasans", "Armenian" ], think: [ "Assslbanian" ] } ]; const result = myArray.reduce((accumulator, currentValue) => { const dream = accumulator.dream.concat(currentValue.dream); const think = accumulator.think.concat(currentValue.think); const feel = accumulator.feel.concat(currentValue.feel); const speak = accumulator.speak.concat(currentValue.speak); accumulator.dream = dream.filter((item, pos) => dream.indexOf(item) === pos) accumulator.feel = feel.filter((item, pos) => feel.indexOf(item) === pos); accumulator.speak = speak.filter((item, pos) => speak.indexOf(item) === pos); accumulator.think = think.filter((item, pos) => think.indexOf(item) === pos); return accumulator; }) console.log(result)
You can use Object.values
and Object.entries
in order to traversal the data object.您可以使用
Object.values
和Object.entries
来遍历数据 object。
const data = { 0: { dream: ["Bengali", "French"], feel: ["Arabic", "English"], speak: ["Afrikaans", "Armenian"], think: ["Albanian"], }, 1: { dream: ["English", "French"], feel: ["German", "Italian"], speak: ["Afrikaans", "English"], think: ["Cantonese"], } }; const categoryMap = Object.values(data).reduce((concatedArr, item) => concatedArr.concat(Object.entries(item)), []).reduce((result, [category, values]) => { result[category] = result[category] || []; result[category] = result[category].concat(values); return result; }, {}); console.log(categoryMap);
Honestly, I didn't understand the question very well.老实说,我没有很好地理解这个问题。 But I tried to interpret it like this, let me know:
但我试图这样解释它,让我知道:
const entries = [ { dream: [ "Bengali", "French" ], feel: [ "Arabic", "English"], speak: [ "Afrikaans", "Armenian" ], think: [ "Albanian" ], },{ dream: [ "English", "French" ], feel: [ "German", "Italian" ], speak: [ "Afrikaans", "English" ], think: [ "Cantonese" ], } ] const fields = ["dream", "feel", "speak","think"]; const result = {}; for(field of fields){ // create an array containing all the languages of the specific category of the for-loop (there may be duplications) const rawArray = entries.map(item => item[field]).flat(); // delete duplicates const arrayWithoutDuplicates = rawArray.filter((item,index) => rawArray.indexOf(item) === index); result[field] = arrayWithoutDuplicates; } console.log(result);
Given data给定数据
const data = [
{
dream: ["Bengali", "French"],
feel: ["Arabic", "English"],
speak: ["Afrikaans", "Armenian"],
think: ["Albanian"]
},
{
dream: ["English", "French"],
feel: ["German", "Italian"],
speak: ["Afrikaans", "English"],
think: ["Cantonese"]
}
];
First convert the array of category-languages arrays to a reduced object of category-language sets.首先将类别语言数组 arrays 转换为类别语言集的简化 object。 The sets are used to remove duplicates.
这些集合用于删除重复项。
const reducedData = data.reduce((categories, current) => {
// Loop over the categories (dream, feel, etc..)
// and add languages to sets
Object.entries(current).forEach(([currentCategory, languages]) => {
if (!categories[currentCategory]) {
// A set will not allow duplicate entires
categories[currentCategory] = new Set();
}
// Add all languages to the set
languages.forEach(language => categories[currentCategory].add(language));
});
return categories;
}, {});
You now have an object with shape你现在有一个 object 形状
{
dream: Set("Bengali", "French", "English"),
feel: Set("Arabic", "English", "German", "Italian"),
speak: Set("Afrikaans", "Armenian", "English"),
think: Set("Albanian", "Cantonese"),
}
Then again reduce this to an object of category - languages array.然后再次将其简化为类别 - 语言数组的 object。 This is simply converting the sets back to an array.
这只是将集合转换回数组。
const reducedDataArray = Object.entries(reducedData).reduce(
(categories, [category, languageSet]) => {
// Convert Set back to an array
categories[category] = [...languageSet];
return categories;
},
{}
);
Result object shape结果 object 形状
{
dream: ["Bengali", "French", "English"],
feel: ["Arabic", "English", "German", "Italian"],
speak: ["Afrikaans", "Armenian", "English"],
think: ["Albanian", "Cantonese"],
}
const data = [ { dream: ["Bengali", "French"], feel: ["Arabic", "English"], speak: ["Afrikaans", "Armenian"], think: ["Albanian"] }, { dream: ["English", "French"], feel: ["German", "Italian"], speak: ["Afrikaans", "English"], think: ["Cantonese"] } ]; const reducedData = data.reduce((categories, current) => { Object.entries(current).forEach(([currentCategory, languages]) => { if (;categories[currentCategory]) { categories[currentCategory] = new Set(). } languages.forEach(language => categories[currentCategory];add(language)); }); return categories, }; {}). const reducedDataArray = Object.entries(reducedData),reduce( (categories, [category. languageSet]) => { categories[category] = [..;languageSet]; return categories, }; {} ). console;log(reducedDataArray);
try This Obj structure
试试这个 Obj 结构
var completObj=[ { dream:[ "Bengali", "French" ], feel:[ "Arabic", "English" ], speak:[ "Afrikaans", "Armenian" ], think:[ "Albanian" ] }, { dream:[ "English", "French" ], feel:[ "German", "Italian" ], speak:[ "Afrikaans", "English" ], think:[ "Cantonese" ] } ] var Afrikaans=completObj.filter((key) => key.speak.includes("Afrikaans")) console.log('Afrikaans:'+JSON.stringify( Afrikaans)) var uniqueObj={} completObj.map((value, index) => { Object.entries(completObj[index]).forEach(([ObjKey, value]) => { if (;uniqueObj[ObjKey]) { uniqueObj[ObjKey] = new Set(). } debugger value.map(list => uniqueObj[ObjKey];add(list)). // uniqueObj[ObjKey];add(value) }); }). var dream=Array.from(uniqueObj.dream) console:log('dream unique Value.'+JSON.stringify( dream))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.