我想检查对象数组中是否已经存在item.name
,因此它不会将现有对象推入数组。
这是一段代码:
loadedVariations.forEach(function(item){
console.log('item', item.name.indexOf(name));
if(name === tests[test].id && item.name.indexOf(name) < 0){
console.log(item.name)
loadedVariations.push({name: name, variation: variation});
tests[test].callback(name, variation);
console.log('tests', tests[test], variation, loadedVariations);
if(variation === '1'){
value = "control"
} else {
value = "variationb"
}
localStorage.setItem('gtmTest', JSON.stringify(loadedVariations));
}
})
这是我本地存储中的输出:
gtmTest:
[{"name":"globalPassFrame_review","variation":"1"},
{"name":"globalPassFrame_review","variation":"1"},
{"name":"socialshare_bar","variation":"2"},
{"name":"socialshare_bar","variation":"2"}]
这是google标记管理器中的AB测试,具有在多个测试脚本上运行的帮助脚本,因此它可以运行多次,这就是为什么我需要检查对象数组中是否已存在所有项目,因此它不会推送相同的对象两次。
答案 0 :(得分:0)
这是如何使用every和match name遍历json object
的方法。如果要具有唯一名称数组,可以使用forEach进行迭代,并检查它是否不存在于数组中。
var object = [{"name":"globalPassFrame_review","variation":"1"},{"name":"globalPassFrame_review","variation":"1"},{"name":"socialshare_bar","variation":"2"},{"name":"socialshare_bar","variation":"2"}];
var tobeFound='globalPassFrame_review';
object.every(function (elem, i) {
if(elem.name == tobeFound ){
console.log('element found at index '+i);
return false ;
}
});
// In case you want to store uniue Names
var uniqueNames=[];
object.forEach(function (elem, i) {
if(!uniqueNames.includes(elem.name)){
uniqueNames.push(elem.name);
}
});
console.log(`unique Names are ${uniqueNames}`);
// Using ES6 style of code.
const uniqueNamesArr = [...new Set( object.map(obj => obj.name)) ];
console.log(uniqueNamesArr);