检查obj是否存在并推送到数组

时间:2017-01-23 05:34:15

标签: javascript angularjs arrays json

我想迭代一个JSON响应,检查是否存在key,value,如果没有,则将其添加到数组中。

  $scope.InitProdToArray = function (data) {
    angular.forEach($scope.data.obj.Product, function(value, index) {

        if (value.Product_type != 'T' ) {
            $scope.data.obj.Product.push({Product_type: 'T'});
        }
        if (value.Product_type != '16364NB' ) {
            $scope.data.obj.Product.push({Product_type: '16364NB'});
        }
        if (value.Product_type != '39087NB' ) {
            $scope.data.obj.Product.push({Product_type: '39087NB'});
        }
        if (value.Product_type != 'C' ) {
            $scope.data.obj.Product.push({Product_type: 'C'});
        }
        if (value.Product_type != '4NB' ) {
            $scope.data.obj.Product.push({Product_type: '4NB'});
        }        
    });

  JSON: $scope.data.obj.Product = 
                    [{
                        "Count": 28,
                        "Product_type": "T"
                    }, {
                        "Count": 88,
                        "Product_type": "4NB"
                    }, {
                        "Count": 20,
                        "Product_type": "C"
                    }, {
                        "Count": 3,
                        "Product_type": "39087NB"
                    }
                ]

这似乎不起作用,因为每次迭代每个节点时我都在推动键值对。我最终得到了一个具有多个product_type相同的JSON。

有没有办法阻止代码添加额外的键值,如果它已经存在?

3 个答案:

答案 0 :(得分:1)

您似乎已将您的类型检查颠倒过来了。 而不是if (value.Product_type != 'T' ) {...我会想象像if (value.Product_type == 'T' ) {...这样的方式,只有当类型匹配时才会推送到Product数组。

除此之外,如果Product数组已包含该类型的密钥,您也可以在推送之前进行检查:if($scope.data.obj.Product.indexOf(value.Product_type)!==undefined)

答案 1 :(得分:0)

从您的代码中看起来您正在进行搜索和插入,而不是与键/值有关。

如果您只支持新浏览器,那么就会有一个名为find的便捷功能。

var productTypes = ['T', '16364NB', '39087NB', 'C', '4NB'];

angular.forEach(productTypes, function(value) {
    var exists = $scope.data.obj.Product.find(function(item) {
        return (item.Product_type == value);
    });

    if (!exists) {
        $scope.data.obj.Product.push({
            Product_type: value,
            count: 0
        });
    }
});

如果您需要支持旧浏览器,则还需要为find添加polyfill

答案 2 :(得分:0)

var TYPES = { T: 'T', NB4: '4NB', C: 'C', NB39087: '39087NB'	};
var products = [{ "Count": 28, "Product_type": "T" }, { "Count": 88, "Product_type": "4NB" }];

/* check if the element key is not the specified value....*/
function isKeyInElement(keyToCheck, element) {
	return element.Product_type === keyToCheck;
}

/* checks if there are NO elements in array with the specified key ...*/
function isKeyInArray(keyToCheck, array) {
	return !!array.filter(function (element) { return isKeyInElement(keyToCheck, element); }).length;
}

/* another way to check if there are NO elements in array with the specified key ...*/
function isKeyInArray2(keyToCheck, array) {
	return array.map(function (element) { return element.Product_type; }).indexOf(keyToCheck) > -1;
}

function initProdToArray(source) {
	if (!isKeyInArray(TYPES.T, source)) { source.push({ Product_type: TYPES.T }); }
	if (!isKeyInArray(TYPES.NB4, source)) { source.push({ Product_type: TYPES.NB4 }); }
	if (!isKeyInArray(TYPES.C, source)) { source.push({ Product_type: TYPES.C }); }
	if (!isKeyInArray(TYPES.NB39087, source)) { source.push({ Product_type: TYPES.NB39087 }); }
}

initProdToArray(products);
console.log(products);