javascript 从嵌套键值按字母顺序将对象插入数组

ncgqoxb0  于 2023-03-11  发布在  Java
关注(0)|答案(1)|浏览(137)

我的应用程序调用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”,名称:“梨”}
这是不正确的,所有其他项目都按预期订购。

fnx2tebb

fnx2tebb1#

如果找不到匹配项,findIndex将返回-1
-1作为索引传递给splice时,它将其插入倒数第二个位置,因为负索引从末尾开始计数,而不是从开头。

const arr = [1,2,3]
arr.splice(-1, 0, 4)
console.log(arr) // [1,2,4,3]

因此,您可以通过检测该情况并确保将其插入到末尾来修复它,而不是使用:

if (index === -1) index = myList.length

例如:

mockHttp()
      .then((res: Array<any>) => {
        console.log(res)
        res.forEach(item => {
          let index = findIndex(myList, function(listItem) { 
            return listItem.name.toLowerCase() > item.name.toLowerCase(); 
          });
          if (index === -1) index = myList.length // added

          myList.splice(index, 0, {
            name: item.name,
            id: item.id,
            enabled: false
          })
        })

        console.log('result', myList);
      });

仅供参考:我在循环中使用以下代码段调试了此代码:

console.log('inserting', item.name, 'at index', index, 'into', myList.map(v => v.name))

这就很清楚地表明了当它记录这个的时候发生了什么:

相关问题