我有2个对象/数组:
var objA = {
Red Chair : "DC10291",
USBDongle : "USKI82322",
}
var arrayB = [
{
field: "Yellow Banana",
id: "Yellow Banana"
},
{
field: "Red Chair",
id: "Red Chair"
},
{
field: "Garden",
id: "Garden"
}
]
我要做的是,如果来自KEY
的{{1}},例如objA
中存在Red Chair
,然后将其从arrayB
中删除。
我做到了:
arrayB
以上是按预期工作的,但这是最有效的吗? Reasone我问的是因为循环throuhg和数组循环中的数组不觉得最好的做法?并会产生性能影响
答案 0 :(得分:2)
你可以简单地过滤它,就像这样
_.filter(arrayB, obj => !objA.hasOwnProperty(obj.field))
// [ { field: 'Yellow Banana', id: 'Yellow Banana' },
// { field: 'Garden', id: 'Garden' } ]
这使用ES2015的Arrow函数语法。您可以使用像这样的正常函数编写相同的内容
arrayB.filter(function(obj) {
return !objA.hasOwnProperty(obj.field);
});
// [ { field: 'Yellow Banana', id: 'Yellow Banana' },
// { field: 'Garden', id: 'Garden' } ]
我们基本上过滤掉field
中objA
值为关键字的所有对象。
答案 1 :(得分:1)
如果您希望保留原始arrayB并根据您的条件获得它的简化版本,那么 static void element_Loaded(object sender, RoutedEventArgs e)
{
FrameworkElement element = (FrameworkElement)sender;
element.Loaded -= element_Loaded;
ScrollViewer scrollViewer = FindChildOfType<ScrollViewer>(element);
if (scrollViewer == null)
{
throw new InvalidOperationException("ScrollViewer not found.");
}
var listener = new DependencyPropertyListener();
listener.Changed
+= delegate
{
bool atBottom = scrollViewer.VerticalOffset
>= scrollViewer.ScrollableHeight;
if (atBottom)
{
var atEnd = GetAtEndCommand(element);
if (atEnd != null)
{
atEnd.Execute(null);
}
}
};
Binding binding = new Binding("VerticalOffset") { Source = scrollViewer };
listener.Attach(scrollViewer, binding);
}
会以O(n)时间复杂度执行此操作。但是,如果您想要执行此操作,那么Array.prototype.reduce()
会以O(n)时间复杂度执行此操作。
Array.prototype.reduceRight()
&#13;