Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何通过特定键在数组中按字母顺序对对象进行分组?_Javascript_Arrays_Reactjs_Typescript_Ecmascript 6 - Fatal编程技术网

Javascript 如何通过特定键在数组中按字母顺序对对象进行分组?

Javascript 如何通过特定键在数组中按字母顺序对对象进行分组?,javascript,arrays,reactjs,typescript,ecmascript-6,Javascript,Arrays,Reactjs,Typescript,Ecmascript 6,我有一系列的国家对象,每个国家都有一些价值观。但我需要按字母顺序把它们列在一个列表里 //全球品牌 { [ { id:1, 标题:“阿根廷”, 内容:[{url:'www.argentinca.com',标题:“阿根廷标题”}]z }, { id:2, 标题:“加拿大”, 内容:[{url:'www.canada.com',标题:“canada title”}] }, { id:3, 标题:“智利”, 内容:[{url:'www.chile.com',标题:“chile title”}] },

我有一系列的国家对象,每个国家都有一些价值观。但我需要按字母顺序把它们列在一个列表里

//全球品牌
{
[
{
id:1,
标题:“阿根廷”,
内容:[{url:'www.argentinca.com',标题:“阿根廷标题”}]z
},
{
id:2,
标题:“加拿大”,
内容:[{url:'www.canada.com',标题:“canada title”}]
},
{
id:3,
标题:“智利”,
内容:[{url:'www.chile.com',标题:“chile title”}]
},
{
id:4,
标题:"中国",,
内容:[{url:'www.china.com',标题:“china title”}]
},
{
id:5,
标题:“芬兰”,
内容:[{url:'www.finland.com',标题:“finland title”}]
},
{
id:5,
标题:"法国",,
内容:[{url:'www.france.com',标题:“法国标题”}]
},
]
}
我创建了一个新的数组,其中的输出应该是这样或类似的东西,这样我就可以访问按字母顺序排序的国家的属性

[
    {
        id: 1,
        letter: 'A',
        country: ['Argentina'],
        content: [{url: 'www.some.com', title: "A Title"}]
    },
    {
        id: 2,
        letter: 'C',
        country: ['Canada', 'Chile', 'China'],
        content: [{url: 'www.canada.com', title: "Canada Title"}, {url: 'www.chile.com', title: "Chile Title"}, {url: 'www.china.com', title: "China Title"}]
    },
    {
        id: 3,
        letter: 'F',
        country: ['Finland', 'France'],
        content: [{url: 'www.finland.com', title: "Finlanda Title"}, {url: 'www.france.com', title: "France Title"}]
    },
]
我有两个功能:

function mergeObjectsInUnique<T> (array: T[], property: unknown): T[] {
    const newArray = new Map();

    array.forEach((item: T) => {
      // @ts-ignore
      const propertyValue = item[property];

      if (newArray.has(propertyValue)) {
        return newArray.set(propertyValue, { ...item, ...newArray.get(propertyValue) });
      }

      return newArray.set(propertyValue, item);
    });

    return Array.from(newArray.values());
}

const sortBrands = (): NewBrandInterface[] => {
    let newArr: NewBrandInterface[] = [];

    for (let i = 0; i < globalBrands.length; i++) {
      const itemIdx = globalBrands[i];

      // This structure can be change to whatever is better
      newArr = [
        ...newArr,
        ...[{
          id: itemIdx.drupal_id,
          letter: itemIdx.title.charAt(0),
          country: [itemIdx.title],
          content: itemIdx.content.map(g => ({
            url: g.url,
            title: g.title
          }))
        }]
      ];
    }

    return mergeObjectsInUnique(newArr, 'letter');
};
函数mergeObjectsInUnique(数组:T[],属性:未知):T[]{
const newArray=newmap();
array.forEach((项:T)=>{
//@ts忽略
常量属性值=项[属性];
if(newArray.has(propertyValue)){
返回newArray.set(propertyValue,{…item,…newArray.get(propertyValue)});
}
返回newArray.set(propertyValue,item);
});
返回Array.from(newArray.values());
}
const sortBrands=():NewBrandInterface[]=>{
让newArr:NewBrandInterface[]=[];
for(设i=0;i({
url:g.url,
标题:g.标题
}))
}]
];
}
return mergeObjectsInUnique(newArr,'letter');
};
该代码只返回country数组中的一项。与字母
C
一样,有3个标题/国家以字母
C
开头,分别是加拿大、智利和中国,因此所有这些标题/国家都应在
country
数组及其正确值(url、title)中返回。芬兰和法国也是如此

我做错了什么

如果你在操场上看到输出,它会删除项目,只留下一个带有起始字母的项目。对于
C
,它只离开加拿大,但删除了另外2个


我创建了一个与我发布的代码完全相同的示例。

您的问题有点让人困惑,但是如果您希望重构按字母分组的输入数组,您可以使用单个调用

const input=[{id:1,标题:'阿根廷',内容:[{url:'www.argentinca.com',标题:'阿根廷标题'}],{id:2,标题:'加拿大',内容:[{url:'www.Canada.com',标题:'加拿大标题'}],{id:3,标题:'智利',内容:[{url:'www.Chile.com',标题:'智利标题'}],{id:4,标题:'中国',内容:[{url:'www.china.com',title:'china title'}]},{id:5,title:'Finland',content:[{url:'www.Finland.com',title:'Finland title'}]},{id:5,title:'France',content:[{url:'www.France.com',title:'France title'}]},];
设i=1;
const result=Object.values(
input.reduce((acc,{id,title,content})=>{
常量字母=标题[0]
acc[letter]=acc[letter]|{id:i++,字母,国家:[],内容:[]
//或者使用逻辑空赋值
//acc[字母]??={id:i++,字母,国家:[],内容:[]
acc[信函].country.push(标题);
acc[letter].content.push(…content);
返回acc
},{})//将累加器初始化为空对象
log(JSON.stringify(result,null,2));

.as console wrapper{max height:100%!important;top:0;}
也许我遗漏了什么,但是按照国家名称的字母顺序对问题中的第一个数据结构进行排序就这么简单:
globalBrands.sort((a,b)=>a.title-b.title)
@RandyCasburn我需要按字母对它们进行分组。如果您看到我发布的第一个json,则没有
字母
,然后我创建一个数组
newArr
,其中一个对象包含一个键/值
字母:itemIdx.title.charAt(0)
。在那里,我得到每个国家的第一个字母。如果有10个国家有相同的字母,我必须将它们分组。id:3,字母:C,['Finland',France']的对象也是如此一个输入错误?很好,这是一个输入错误,@RandyCasburn。在那个例子中,我放置了预期的输出。我能知道这是什么吗?=?它抛出一个错误:
解析错误:表达式预期。eslint
是运算符,为了兼容性,你可能必须使用
|
短电路,我将添加它很好的回答!我的建议是使用更好的变量名。
reduce()
通常很难理解,因此使用
a
k
会使代码更加复杂:)(顺便说一句,我喜欢带有“null赋值”的注释选项这是一个公平的观点,我将编辑它以澄清可变角色。太棒了,谢谢!