我的应用程序调用http并返回一个对象数组。我需要循环对象并按字母顺序插入到一个新数组中。问题是新创建数组中的最后一项是唯一乱序的项。
示例代码:https://stackblitz.com/edit/typescript-zh16xc?file=package.json,index.ts
我知道我可以使用native .sort(),但是我选择forEach,因为我对每个项执行更多的操作,但是这个示例已经被精简了。
代码:
import { findIndex } from 'lodash';
let myList = [];
mockHttp()
.then((res: Array<any>) => {
console.log(res)
res.forEach(item => {
let index = findIndex(myList, function(listItem) {
return listItem.name.toLowerCase() > item.name.toLowerCase();
});
myList.splice(index, 0, {
name: item.name,
id: item.id,
enabled: false
})
})
console.log('result', myList);
});
function mockHttp() {
let p = new Promise(function(resolve,reject){
resolve([
{
id: 'dscjidovvocsi', name: 'Pear'
},
{
id: 'dscjidovvocsi', name: 'Banana'
},
{
id: 'dscjidovvocsi', name: 'Orange'
},
{
id: 'dscjidovvocsi', name: 'Blueberry'
},
{
id: 'dscjidovvocsi', name: 'Grapefruit'
},
{
id: 'dscjidovvocsi', name: 'Peach'
},
{
id: 'dscjidovvocsi', name: 'Strawberry'
},
{
id: 'dscjidovvocsi', name: 'Dragonfruit'
},
{
id: 'dscjidovvocsi', name: 'Mango'
},
{
id: 'dscjidovvocsi', name: 'Apples'
}
]);
});
return p;
}
最后一项是:{已启用:假,ID:“dscjidovvocsi”,名称:“梨”}
这是不正确的,所有其他项目都按预期订购。
1条答案
按热度按时间fnx2tebb1#
如果找不到匹配项,
findIndex
将返回-1
。当
-1
作为索引传递给splice
时,它将其插入倒数第二个位置,因为负索引从末尾开始计数,而不是从开头。因此,您可以通过检测该情况并确保将其插入到末尾来修复它,而不是使用:
例如:
仅供参考:我在循环中使用以下代码段调试了此代码:
这就很清楚地表明了当它记录这个的时候发生了什么: