【问题标题】:Typescript - Get next and previous item from dictionary or array dynamicallyTypescript - 从字典或数组中动态获取下一个和上一个项目
【发布时间】:2019-02-24 18:33:49
【问题描述】:

我是 Angular 新手,目前正在开发 Angular 5 应用程序。我需要从字典(模型)中获取下一个或上一个项目以进行下一个和上一个导航以获取路线。我查看了多篇文章并提出了以下方法。让我知道是否有其他有效和可靠的方法可以做到这一点。我还需要确保它按值排序,以确保它在服务器(api)和客户端之间保持相同的顺序。这将是我们应用程序导航的一个重要方法,所以我想确保没有浏览器兼容性问题,没有缺点并且它是可靠的。最坏的情况我可以使用常规的 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 ], ... ]
}

【问题讨论】:

  • 您最好使用数组,因为 JavaScript 属性顺序无法保证。如果您有一个对象,则将其转换为数组。
  • @danday74 数组中的顺序是否保持相同的黑白 api 和客户端?即,它会以添加方式保留订单吗?谢谢
  • 另外,如果数组总是排序并且分布不是太极端,您可以进行某种乐观的 log(n) 查找(如二进制搜索),而不是盲目地遍历整个事物。
  • 是的,它会保证订单保持不变——当你 .push() 你添加到最后——当你 .unshift() 你添加到开头
  • 要在数组中查找对象,您应该像这样使用 lodash find ... stackoverflow.com/questions/31054021/… ... JS 世界中的大多数人都使用 lodash - 它提供了大量的函数来生成数组操作简单等等 - 它是最流行的 JS lib 和 npm 模块

标签: javascript angular typescript


【解决方案1】:

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

每次您想要下一个或上一个属性时都对属性进行排序,这是在不故意使情况变得更糟的情况下尽可能低效的。至少使用一个数组来永久存储您的(排序的)条目。

如果这些操作(nextprevious)是您计划对结构执行的主要操作,并且其中可能有很多项目,您应该使用一种廉价地执行操作的结构:doubly-linked list

如果您既想要这种方式又想要廉价的直接访问,则必须在某处为此付费。一种解决方案是使用数组或 Map 进行廉价的直接访问,并在其中的所有项目上维护 nextprevious 属性以也具有链表行为。每次你改变结构时你都会为此付出代价,但这可能没问题,特别是如果它不经常改变的话。

【讨论】:

  • 链表/数组的好解释
  • 感谢您的回复。我更喜欢您的建议,即在字典中的所有项目上维护下一个和上一个属性,然后直接在客户端上进行查找。我计划将其存储在会话服务中,因此仅在刷新时才会重新加载/重建(在 Web 服务器中)。谢谢
  • 如果这样做,最好以这种形式传输字典:[[name1, {val1, next, prev}], [name2, {val2, next, prev}}], …]。因为您可以将其传递给Map 构造函数。对于这种用法,地图比原始对象好一点(一方面,它们是可迭代的)。如果一切都是在服务器端计算的,nextprev 属性可以只是下一个和上一个项目的键,而不是引用。所以如果你已经有一个条目item,你会得到下一个dict.get(item.next)
  • 哦,Maps 确实保证迭代顺序是插入项目的顺序。
  • @Touffy 谢谢。我想我只需要 [[name1, {next, prev}]。到目前为止,我还没有使用过 Map。我会仔细看看的。如果我将 prev 和 next 值存储在同一个项目中,那么我不需要 id 来订购,并且订购不再重要。我可以通过 key 进行查找,即 name1。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
  • 1970-01-01
  • 2017-09-04
  • 2021-06-08
  • 2021-04-26
  • 1970-01-01
相关资源
最近更新 更多