【问题标题】:Transferring Properties from one to another object based on the value of another property根据另一个属性的值将属性从一个对象转移到另一个对象
【发布时间】:2015-09-29 15:15:06
【问题描述】:

我有一个小问题。我正在开发一个角度应用程序,并且在某些时候我从 api 获取一些数据。

我有一个带有项目 url 的现有对象,并且正在获取一个包含 hours 属性和项目 urls 属性的 timeslip 对象数组,以指示它们属于哪个项目。

我想要实现的是遍历我获得的所有时间片,以便将小时数转移到具有匹配 url 属性的项目数组中的项目。

项目数组是:$scope.projectsObject

我的代码如下所示:

for (var i = 0; i < response.data.timeslips.length; i++) {

    //SET LOCAL VARIABLE FOR SELECTED TIMESLIP
    var timeslip = response.data.timeslips[i];

    //ITERATE THROUGH PROJECTS ARRAY
    for (var ii = 0; ii < Object.keys($scope.projectsObject).length; ii++) {

        //SEE IF TIMESLIP BELONGS TO PROJECT
        if ($scope.projectsObject[ii].url == timeslip.url) {

            //SEE IF $scope.projectsObject HAS HOURS PROPERTY
            if ('hours' in $scope.projectsObject[ii]) {

                //IF YES ADD HOURS TO EXISTING AMOUNT
                $scope.projectsObject[ii].hours = $scope.projectsObject[ii].hours + timeslip.hours;

            } else {
                //IF NOT CREATE IT AND ADD HOURS
                $scope.projectsObject[ii] = { "hours": timeslip.hours };
            }
        }
    }
}

问题似乎在于识别上一个时间片的小时数何时已添加到项目中,我不想从新创建小时属性,而只是将当前时间片的小时数添加到之前已经添加了。

如果有人能在这里指出我的错误,那就太好了,因为我似乎找不到它。

非常感谢!

【问题讨论】:

  • 你能提供一些来自response.data.timeslips$scope.projectsObject 的数据吗?当你可以做到$scope.projectsObject[ii].hours = timeslip.hours;时,你为什么要$scope.projectsObject[ii] = { "hours": timeslip.hours };?另一种方式删除($scope.projectsObject[ii].url
  • 而不是if('hours' in $scope.projectsObject[ii]),如果($scope.projectsObject[ii].hasOwnProperty('hours')),你试过了吗??
  • 如果没有足够的代码和数据样本来复制,这里的任何人都很难调试。创建一个人们可以调试的简单演示
  • 在代码中也设置断点,这样你就可以看到每一步是什么
  • response.data.timeslips 的示例:[{"hours":"7.0","url":"https://api.sample.com"},{"hours":"2.5","url":"https://api.sample1.com"},{"hours":"0.5","url":"https://api.sample2.com"},...] $scope.projectsObject 的示例:[{"url": "https://api.sample1.com"},{"url": "https://api.sample.com"},{"url": "https://api.sample2.com"},...] 我现在想根据网址。我尝试使用 hasOwnProperty 并没有改变任何东西......

标签: javascript angularjs object


【解决方案1】:

我建议使用更简洁的代码。

发生了什么变化:

  • response.data.timeslips 的迭代。
  • $scope.projectsObject 的迭代。
  • 测试属性url 在两个对象中是否相等。
  • 如果未设置b.hours,则提供默认值0
  • timeslip.hoursString 转换为Number
  • 添加值。
  • 将新值分配给 b.hours(并保持对象 b 的其余部分不变)。

var response = { data: { timeslips: [{ "hours": "7.0", "url": "api.sample.com" }, { "hours": "2.5", "url": "api.sample1.com" }, { "hours": "3.1", "url": "api.sample1.com" }, { "hours": "0.5", "url": "api.sample2.com" }] } },
    $scope = { projectsObject: [{ "url": "api.sample1.com" }, { "url": "api.sample.com" }, { "url": "api.sample2.com" }] };

response.data.timeslips.forEach(function (timeslip) {
    $scope.projectsObject.forEach(function (b) {
        if (timeslip.url === b.url) {
            b.hours = (b.hours || 0) + +timeslip.hours;
        }
    });
});
document.write('<pre>' + JSON.stringify($scope, 0, 4) + '</pre>');

【讨论】:

  • 我想timeslip.hours仍然需要使用parseFloat解析为浮点数。不确定+ +timeslip.hours 的作用。
  • 它就是这样做的。将值转换为数字,参见上面的 sn-p 结果
【解决方案2】:

变化:

if ($scope.projectsObject[ii].url == timeslip.project) {

到:

if ($scope.projectsObject[ii].url == timeslip.project.url) {

【讨论】:

  • 哦,是的!对不起,那是一个错字。不幸的是,代码仍然无法正常工作:(
猜你喜欢
  • 2012-04-03
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2020-06-22
  • 1970-01-01
  • 1970-01-01
  • 2022-06-29
  • 1970-01-01
相关资源
最近更新 更多