我有一组对象,看起来像这样:
[
{
"label": "anystring",
"processowner": ["any name"],
"withwhat": ["any text"],
"withwho": ["any text"],
"processstep": ["any text"],
"cluster": ["anyValue1"]
},
{
"label": "anystring",
"processowner": ["any name"],
"withwhat": ["any text"],
"withwho": ["any text"],
"processstep": ["any text"],
"cluster": ["anyValue2"]
},
{
"label": "anystring",
"processowner": ["any name"],
"withwhat": ["any text"],
"withwho": ["any text"],
"processstep": ["any text"],
"cluster": ["anyValue1"]
},
.........
]
重要的Key,Value对是"cluster"
。有可能会有更多具有相同"""' -Value的对象。我想要的是一个只有"cluster"
- 值的新数组。但每次只有一次!那是我的挣扎。
到目前为止我所做的是循环遍历给定数组并将当前"cluster"
- 值与第二个(最终)数组"tempNewJson"
(第二个循环)进行比较 - 填充第一个对象{{1它中给定数组的大小。如果值已经在"initObj"
中,我希望代码什么也不做。如果值尚未在"tempNewJson"
中,我想添加它。但是我仍然在我的最终数组"tempNewJson"
中得到重复值和错误数量的值。
"tempNewJson"
任何人都知道如何解决这个问题? 感谢。
输出应该如下所示
function convertJSON(initJson) {
var initObj = {};
initObj.title = initJson[0].cluster.toString();
initObj.scale = 6;
initObj.type = 'group-case-5-3';
initObj.children = [];
tempNewJson.push(initObj);
var contains = false;
// Schleife über alle Items in initialem JSON
for (var i = 0; i < initJson.length; i++) {
// Schleife über bisher hinzugefügte Objekte in tempNewJSON
contains = false;
for(var j = 0; j < tempNewJson.length; j++) {
contains = false;
if(initJson[i].cluster.toString() === tempNewJson[j].title) {
contains = true;
console.log(initJson[i].cluster.toString());
break;
}
}
if(contains === false) {
initObj.title = initJson[i].cluster.toString();
console.log('test: ' + initJson[i].cluster.toString());
tempNewJson.push(initObj);
}
}
}
我使用了Nina Scholz的答案:
["anyValue1", "anyValue2", .....]
我所知道的是以下数组:
var result = initJson.reduce(function (tempNewJson, initJson) {
!~tempNewJson.indexOf(initJson.cluster) && tempNewJson.push(initJson.cluster.toString());
return tempNewJson;
}, []);
console.log(result);
但我想要的是:
['anyValue1', 'anyValue2', 'anyValue1', 'anyValue3', 'anyValue1', .........
答案 0 :(得分:1)
如果你能支持,我会使用a Set
。
let set = new Set;
initObj.map(item =>
item.cluster.map(cluster => set.add(cluster))
);
现在set
是一个具有唯一群集值的可迭代。
否则你可以用数组做到这一点,但是你必须自己进行单一性检查:
let newArr = [];
initObj.map(item =>
item.cluser.map(cluster => {
if (-1 === newArr.indexOf(cluster)) {
newArr.push(cluster);
}
});
);
答案 1 :(得分:0)
您可以使用map()
和filter()
。
var data = [
{
"label": "anystring",
"processowner": ["any name"],
"withwhat": ["any text"],
"withwho": ["any text"],
"processstep": ["any text"],
"cluster": ["anyValue1"]
},
{
"label": "anystring",
"processowner": ["any name"],
"withwhat": ["any text"],
"withwho": ["any text"],
"processstep": ["any text"],
"cluster": ["anyValue2"]
},
{
"label": "anystring",
"processowner": ["any name"],
"withwhat": ["any text"],
"withwho": ["any text"],
"processstep": ["any text"],
"cluster": ["anyValue1"]
}
];
var clusters = data.map(function(item) {
return item.cluster[0];
});
clusters = clusters.filter(function(item, pos) {
return clusters.indexOf(item) == pos;
})
console.log(clusters)
&#13;
答案 2 :(得分:0)
您可以使用纯JS简单地遍历您的数组并创建一个结果对象,其中包含具有特定群集键的所有对象,这将创建一个非常有用的对象!只需获得所需的群集名称数组也是如此。
// Simplified test object without all the value
var test = [
{"id": 1,"cluster": ["anyValue1"]},
{"id": 2,"cluster": ["anyValue2"]},
{"id": 3,"cluster": ["anyValue1"]}
];
var result = {};
for(var i = 0; i < test.length; i++){
for(var c = 0; c < test[i].cluster.length; c++){
result[test[i].cluster[c]] = result[test[i].cluster[c]] || [];
result[test[i].cluster[c]].push(test[i]);
}
}
document.write('<pre>');
document.write(JSON.stringify(result));
var result = [];
for(var i = 0; i < test.length; i++){
for(var c = 0; c < test[i].cluster.length; c++){
if(result.indexOf(test[i].cluster[c]) < 0)
result.push(test[i].cluster[c])
}
}
document.write('<br /><br />' + JSON.stringify(result));
document.write('</pre>');
这两个对象都可以以自己的方式非常有用。
答案 3 :(得分:0)
使用Array.prototype.reduce
的简单解决方案。这种方法的优点是可以返回一些东西(这里是一个数组)并将其作为下一次迭代的输入。
var array = [{
"label": "anystring",
"cluster": "anyValue1"
}, {
"label": "anystring",
"cluster": "anyValue2"
}, {
"label": "anystring",
"cluster": "anyValue1"
}],
result = array.reduce(function (r, a) {
!~r.indexOf(a.cluster) && r.push(a.cluster);
return r;
}, []);
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
&#13;