Невозможно получить счет определенного идентификатора от json, используя angularjs - PullRequest
0 голосов
/ 22 мая 2018

Мне нужно получить счет существования идентификатора, сравнив его с другим json.однако в некотором смысле я успешен, но для немногих чисел это становится неправильным счетом.

var outputProducts = [
    { outputId:'1', inputId:   '3', opName: "outMacy"    },
    { outputId:'2', inputId:   '3', opName: "outMacy2"   },
    { outputId:'3', inputId:   '3', opName: "outMacy3"   },
    { outputId:'4', inputId: '235', opName: "EXPENCE"    },
    { outputId:'5', inputId: '235', opName: "opEXPENCE"  },
    { outputId:'6', inputId: '235', opName: "opEXPENCE1" },
    { outputId:'8', inputId: '235', opName: "opEXPENCE3" },
    { outputId:'7', inputId: '215', opName: "JCPenny"    }
];

вот так выглядит мой json, из которого я должен получить

temp = [
    { name:   "3", shownName: 3 },
    { name: "215", shownName: 1 },
    { name: "235", shownName: 4 }
]

, вместо этого он дает мне

temp = [
    { name:   "3", shownName: 7 },
    { name: "215", shownName: 1 },
    { name: "235", shownName: 4 }
]

я чувствую, что он выглядит3 во всем json таким образом он получает счетчик 235, в котором он имеет 3, и показывает его как 7 вместо 3

, вот мой плункер (весь json не виден из-за ошибки PUSH, однако вы можетесм. сгенерированный временный JSON с неправильным счетчиком имени: «3», показано: 7)

https://plnkr.co/edit/aIdlWUS7UFb91hKC4nqx?p=preview

Вот мой код

var outputProducts = [
    { outputId:'1', inputId:   '3', opName: "outMacy"    },
    { outputId:'2', inputId:   '3', opName: "outMacy2"   },
    { outputId:'3', inputId:   '3', opName: "outMacy3"   },
    { outputId:'4', inputId: '235', opName: "EXPENCE"    },
    { outputId:'5', inputId: '235', opName: "opEXPENCE"  },
    { outputId:'6', inputId: '235', opName: "opEXPENCE1" },
    { outputId:'8', inputId: '235', opName: "opEXPENCE3" },
    { outputId:'7', inputId: '215', opName: "JCPenny"    }
];

$scope.outputProducts = outputProducts;

var keysCount, copyOfOutputData, keysCount2, uniqueInputFiles=[], outputFilesCount=[];
keysCount = Object.keys(outputProducts).length;

console.log("$scopes.", $scope.outputProducts);

for (i = 0; i < keysCount; i += 1) {
    if (uniqueInputFiles.indexOf(outputProducts[i].inputId) === -1) {
       uniqueInputFiles.push(outputProducts[i].inputId);
    }
}

console.log("uniqueInputFiles", uniqueInputFiles);

copyOfOutputData = angular.copy(uniqueInputFiles);
keysCount2 = Object.keys(copyOfOutputData).length;

for (i = 0; i < keysCount2; i += 1) {

    outputFilesCount = $filter('filter')( outputProducts, { inputId: copyOfOutputData[i] } ).length;
    temp = {
        name     : copyOfOutputData[i],
        shownName: outputFilesCount
    };
    console.log("temp", temp)

    $scope.inputFilesWithCount.push(temp);
}

Любая помощьценится

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Использовать уменьшить и карту :

var outputProducts = [
    { outputId:'1', inputId:   '3', opName: "outMacy"    },
    { outputId:'2', inputId:   '3', opName: "outMacy2"   },
    { outputId:'3', inputId:   '3', opName: "outMacy3"   },
    { outputId:'4', inputId: '235', opName: "EXPENCE"    },
    { outputId:'5', inputId: '235', opName: "opEXPENCE"  },
    { outputId:'6', inputId: '235', opName: "opEXPENCE1" },
    { outputId:'8', inputId: '235', opName: "opEXPENCE3" },
    { outputId:'7', inputId: '215', opName: "JCPenny"    }
];
function inc(t,x) {
  var i = x.inputId;
  t[i]? t[i].count++:(t[i] = {count: 1})
 return t;
 }
var x = outputProducts.reduce((t,x)=> inc(t,x),{});
var y = Object.keys(x).map(v=>({name: v, shownName: x[v].count}))
console.log(y)
0 голосов
/ 22 мая 2018

Фильтр filter не является точным сравнением, это шаблон при сопоставлении с использованием объекта.Поэтому, когда вы передаете его ...

{
    inputId: '3'
}

... вы фактически просите найти любое значение, которое имеет 3 в свойстве inputId.Для вашего примера, что-то вроде этого было бы более дружественным:

$scope.outputProducts = [
    { outputId:'1', inputId:   '3', opName: "outMacy"    },
    { outputId:'2', inputId:   '3', opName: "outMacy2"   },
    { outputId:'3', inputId:   '3', opName: "outMacy3"   },
    { outputId:'4', inputId: '235', opName: "EXPENCE"    },
    { outputId:'5', inputId: '235', opName: "opEXPENCE"  },
    { outputId:'6', inputId: '235', opName: "opEXPENCE1" },
    { outputId:'8', inputId: '235', opName: "opEXPENCE3" },
    { outputId:'7', inputId: '215', opName: "JCPenny"    }
];

var counts = {};

angular.forEach($scope.outputProducts, function (product) {
    if (typeof counts[product.inputId] === 'undefined') {
        counts[product.inputId] = 0;
    }

    counts[product.inputId] = counts[product.inputId] + 1;
});

$scope.inputFilesWithCount = [];
angular.forEach(counts, function (total, inputId) {
    $scope.inputFilesWithCount.push({
        name: inputId,
        shownName: total
    });
});

Это сгенерирует значения, на которые вы надеетесь (более чистым, более эффективным способом), поскольку все, что вы действительно делаете, это обновление счетчика..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...