Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于JSON对象的Javascript填充数组_Javascript_Json - Fatal编程技术网

基于JSON对象的Javascript填充数组

基于JSON对象的Javascript填充数组,javascript,json,Javascript,Json,我有一个JSON对象,如下所示: var testJSON = [ { "AssetA": "asset_a", "AssetB": "asset_b" }, { "AssetA": "asset_a", "AssetB": "asset_b" }, { "AssetA": "asset_c", "AssetB": "asset_d" }, { "AssetA": "asset_c", "AssetB": "asset_e" }]; 我要做的是逐步遍历对象,并将重复键添

我有一个JSON对象,如下所示:

var testJSON = [
    { "AssetA": "asset_a", "AssetB": "asset_b" },
    { "AssetA": "asset_a", "AssetB": "asset_b" },
    { "AssetA": "asset_c", "AssetB": "asset_d" },
{ "AssetA": "asset_c", "AssetB": "asset_e" }];
我要做的是逐步遍历对象,并将重复键添加到另一个数组usedAssets。以下是我目前的代码:

var usedAssets = [];

for (var key in testJSON) {
    console.log("Current key: " + key + " " + "value: : " +  testJSON[key].AssetA);
    console.log("Current key: " + key + " " + "value: : " + testJSON[key].AssetB);

    // check if in array
    if ((isInArray(testJSON[key].AssetA, usedAssets) || isInArray(testJSON[key].AssetB, usedAssets))) {
        break;
    }
    else {
        usedAssets.push(testJSON[key].AssetA);
        usedAssets.push(testJSON[key].AssetB);
    }
}
console.log(usedAssets);



function isInArray(value, array) {
    return array.indexOf(value) > -1;
}

但是,我的输出只是一个包含asset_a和asset_b的数组。usedAssets数组应包含资产a、资产b和资产c。我的最终目标是能够在迭代结束时确定,我只使用了资产a一次,资产b一次,资产c一次

听起来你在试图计算每项资产的使用次数。。。最简单的方法是保存一张你以前见过的物体的地图。这是一个很好的方法

var testJSON=[{“AssetA”:“AssetA”,“AssetB”:“AssetB”},{“AssetA”:“AssetA”,“AssetB”:“AssetB”},{“AssetA”:“assetc”,“AssetB”:“assetd”},{“AssetA”:“assetc”,“AssetB”:“AssetB”}];
var usage=testJSON.reduce((上一个,下一个)=>{
prev[next.AssetA]=prev中的next.AssetA?prev[next.AssetA]+1:1;
prev[next.AssetB]=prev中的next.AssetB?prev[next.AssetB]+1:1;
返回上一个;
}, {});
log(‘使用了多少?’,用法);
//如果您想知道哪些被使用了两次或更多次,您可以使用
console.log('多次使用',Object.key(用法).filter(key=>usage[key]>1))

此代码片段获取您的数组并将其缩减为可见值

var testJSON=[
{“资产”:“资产a”,“资产b”:“资产b”},
{“资产”:“资产a”,“资产b”:“资产b”},
{“资产”:“资产c”,“资产B”:“资产d”},
{“资产”:“资产c”,“资产B”:“资产e}];
var-seen={};
var result=testJSON.map(函数(值){
返回对象.keys(值).map(函数(键){
返回值[键];
})
}).减少(功能a、b){
返回a.concat(b);
},[])。过滤器(函数(值){
如果(!看到[值]){
所见[值]=1;
返回true;
}
所见[值]+=1;
返回false;
})
//seen包含每个值被“看到”的次数
log('seen:'+JSON.stringify(seen));

console.log('result:'+result)基本上,您可以迭代数组的所有元素和对象的所有属性,并计算发生次数

var testJSON=[{“AssetA”:“AssetA”,“AssetB”:“AssetB”},{“AssetA”:“AssetA”,“AssetB”:“AssetB”},{“AssetA”:“assetc”,“AssetB”:“assetd”},{“AssetA”:“assetc”,“AssetB”:“assete”},
计数={};
testJSON.forEach(o=>Object.keys(o).forEach(k=>count[o[k]]=(count[o[k]]]| | 0)+1);
控制台日志(计数);
log(Object.keys(count.filter)(k=>count[k]>1))

.as控制台包装{max height:100%!important;top:0;}
testJSON是一个数组。要进行迭代,您需要执行testJSON.forEach(function(each){}@user1655756,这是正确的,但不是本例中的错误源…只需删除中断;这会杀死forloop,这不是您想要的。您应该使用continue而不是break。为什么结果不应该包括
asset\u d
?这段代码似乎是我想要的。然而,我对JS很陌生,很难理解它。Deete你读过我提供的链接吗?理解它的最简单方法是
[1,2,3,4].reduce((prev,next)=>prev+next,0)
。这将添加数组中的所有项,并将0作为计算的起始值。在我的示例中,起始值是一个将用作映射的对象,我们在数组上迭代,将每个元素的对象填充到数组中。如果我读取它,仍然很难理解。无论如何,这个方法告诉我对象中的每个元素出现了多少次,但它没有告诉我有多少连接属于哪些资产。例如,资产_a与资产_b有两个连接。在这种情况下,我要做的是为asset_a绘制一个框,为asset_b绘制一个框,并且在它们之间有两个连接。arrow函数是一个新的ES6功能,为了使用它,您需要编译它。你可以用我的答案,也可以复制到这里@这是函数的新语法,称为。如果您还不能使用EcmaScript 6,只需将其替换为旧语法即可。前面的答案也使用了“=>”符号,但当我将代码段复制到我的项目中时,在这些情况下会出现语法错误。请尝试更传统的编码。您能提供一个示例吗?请参阅第ES5部分