搜索对象和数组定位匹配的最有效方法

时间:2016-06-09 06:59:01

标签: javascript arrays javascript-objects lodash

我有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和数组循环中的数组不觉得最好的做法?并会产生性能影响

2 个答案:

答案 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' } ]

我们基本上过滤掉fieldobjA值为关键字的所有对象。

答案 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)时间复杂度执行此操作。

&#13;
&#13;
Array.prototype.reduceRight()
&#13;
&#13;
&#13;