【问题标题】:Compare values between array and object比较数组和对象之间的值
【发布时间】:2016-10-29 22:08:40
【问题描述】:

我正在使用 Angular 和 Lodash 来处理对象和数组。

鉴于此:

$scope.week = ['monday','tuestday','wednesday','thursday','friday','saturday','sunday']
$scope.points = [
    { day: 'monday', points: 30 },
    { day: 'wednesday', points: 60 }
]

...我想得到这个结果:

$scope.result = [30, 0, 60, 0, 0, 0, 0];

所以我必须将数组与对象进行比较,但我想避免使用多个循环。

见JS Fiddle。

P.S:我不使用 jQuery。

【问题讨论】:

  • 指向小提琴的链接很好,但也请将该代码放入您的问题中。
  • 好的,所以,您想比较 X 和 Y,其中 X 和 Y 是两种不同类型的结构。您到底想在它们之间进行什么比较?这两个源结构是什么?你想从这两个源结构的比较中得到什么结果?似乎您可以从等式中删除 angular 并提供一个只是 javascript 的示例。

标签: javascript arrays angularjs lodash


【解决方案1】:

如果是你的数据结构,你可以使用 Javascript 数组方法,像这样:

var filteredPoints = $scope.points.filter((point) => {
      return $scope.week.indexOf(point.day) != -1;
     });

$scope.result = filteredPoints.map((point) => { return point.points }); 

【讨论】:

  • 我没有投反对票,但运行这段代码会给我一个包含 1 个元素的数组。
  • 我的谓词缺少一个条件,现在已更新
【解决方案2】:

你可以这样做:

var temp = $scope.points.reduce((obj, el) => (obj[el.day] = el.points, obj), {});
$scope.result = $scope.week.map(day => temp[day] || 0);

temp 变量是一个以日期为键的对象,并提供与该日期相关的点作为值。给定示例数据,它看起来像:

{
    monday: 30,
    wednesday: 60
}

它允许在第二条语句中进行高效查找。

见JS fiddle

注意:确保更正周数组('tuestday')中的拼写错误。

【讨论】:

    【解决方案3】:

    您可以使用 lodash 的 _.map 和 _.findIndex 方法或简单的 Array 类,如下所示

    $scope.result =_.map($scope.week, function (v, i) {
        var index = _.findIndex($scope.points, { 'day': v})
        if (index > -1) {
            return $scope.points[index].points
        } else {
            return 0
        }
    })
    

    其中 _ 是 lodash 的一个实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 2012-10-22
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      相关资源
      最近更新 更多