根据另一个属性的值将属性从一个对象传输到另一个对象

时间:2015-09-29 15:15:07

标签: javascript angularjs object

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

我有一个带有项目网址的现有对象,我正在获取一个具有小时属性和项目网址属性的时间夹对象数组,以指示它们属于哪个项目。

我想要实现的是迭代我获得的所有时间片,以便将项目数组中的小时数转移到具有匹配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 };
            }
        }
    }
}

问题似乎在于识别以前的时间片已经添加到项目中的时间,并且我不想从new创建hours属性,但只需将当前时间片的小时数添加到以前已添加的小时数。

如果有人能在这里指出我的错误,那将会很棒,因为我似乎无法找到它。

非常感谢!

2 个答案:

答案 0 :(得分:0)

变化:

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

为:

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

答案 1 :(得分:0)

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

发生了什么变化:

  • response.data.timeslips的迭代。
  • $scope.projectsObject的迭代。
  • 测试两个对象中属性url是否相等。
  • 如果未设置0,请提供默认值b.hours
  • 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>');