打字稿-从字典或数组中动态获取下一个和上一个项目

时间:2018-09-20 12:32:01

标签: javascript angular typescript

我是Angular的新手,目前正在Angular 5应用程序上工作。我需要从dictionary(model)获取下一个或上一个项目,以便进行下一个和上一个导航以获取路线。我研究了多篇文章,并提出了以下方法。让我知道是否还有其他有效且可靠的方式来做到这一点。我还需要确保其按值排序,以确保在server(api)和client之间保持相同的顺序。这将是我们应用程序导航的重要方法,因此我想确保没有浏览器兼容性问题,没有缺点以及它的可靠性。最坏的情况是我可以使用常规的switch case语句,它在多个条件下都很难看,但可以。让我知道你的想法。预先感谢

var dict = {
  "name3": 12,
  "name1": 5,
  "name2": 8
};

var items = sortProperties(dict);
//console.log(items);

var getItem = function(key, i) {

var index = 0;
var stop = true;
for (var j = 0; j < items.length; j++) {  
   
        if (items[j][0] == key) {
            index = j;
            break;// Found it
        }
    }    
console.log(index);
if((index + i) > -1 && (index+i) <items.length)
{
  return items[index+i][0];
}
else
{
 return 'empty';
 }  
}


console.log(getItem("name2",-1));
console.log(getItem("name2",+1));



function sortProperties(obj)
{
  // convert object into array
	var sortable=[];
	for(var key in obj)
		if(obj.hasOwnProperty(key))
			sortable.push([key, obj[key]]); // each item is an array in format [key, value]
	
	// sort items by value
	sortable.sort(function(a, b)
	{
	  return a[1]-b[1]; // compare numbers
	});
	return sortable; // array in format [ [ key1, val1 ], [ key2, val2 ], ... ]
}

1 个答案:

答案 0 :(得分:2)

根据规范,对象中没有固有的属性顺序。在实践中,顺序是确定性的,但是依赖它是一个坏主意。

每次您想要下一个或上一个属性时,对属性进行排序的效率将达到尽可能低的水平,而不会故意使其变差。至少使用数组永久存储您的(排序的)条目。

如果这些操作(下一个上一个)是您打算对结构进行的主要工作,并且其中有很多项目,则应使用一种廉价执行操作的结构:doubly-linked list

如果您既想要直接访问又便宜的直接访问,则必须在某个地方付费。一种解决方案是使用数组或Map进行廉价的直接访问,并在其中的所有项目上维护printnext属性,使其也具有链接列表行为。每次您对结构进行变异时,您都需要为此付费,但这可能是可以的,尤其是当它不经常更改时。