Javascript搜索具有特定值的对象的数组

时间:2015-11-02 15:59:20

标签: javascript arrays loops object

我有一组对象,看起来像这样:

[
    {
        "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', .........

4 个答案:

答案 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()

&#13;
&#13;
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;
&#13;
&#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的简单解决方案。这种方法的优点是可以返回一些东西(这里是一个数组)并将其作为下一次迭代的输入。

&#13;
&#13;
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;
&#13;
&#13;