We’re trying to sort content to recommend to a person using scores. I want to return the URL slugs (that present the slug) in order of the highest score for each contact_id
I’ve got a Loop in my Zap to fetch the relevant scores for each Slug line item. I’m not sure how best to push this to Storage with one key (the contact_id), multiple slug/scores.
e.g.
contact_id: abcde
Slug: example-slug-a
Score: 56
Slug: example-slug-b
Score: 85
Slug: example-slug-c
Score: 74
I’m then not sure how to get all these entries looped through for each contact (there could be 20-30) and then sort them. There’s an outline here, but it uses alphabetical sorting vs. the idea of a score.
Maybe there’s a hacky way to preprend the score value to slug name then use the same desc logic?
Best answer by Mutiny OpsBest answer by Mutiny Ops
We resolve this by asking ChatGPT + the Zapier docs. It should be much easier to handle arrays!
Create a temporary delimiter between values
Converting the input (Zapier Code data input is always a string, so need to convert to an array)
Run a comparison function of unique values
Write back values to map into our onward tool.
let stringSet = inputData.Playbooks;
console.log(stringSet) // Show the ugly string.let Set = stringSet.split('|||'); // Split out by the temporary delimiter
console.log(Set); // Show the array that's fetched
console.log(Array.isArray(Set)) // Evaluates to true// Suspect each line is one long string still.
console.log(Number.isInteger(Set.score)); // Evaluates to false// JSON.parse() was causing problems. GPT alternative suggestion to turn string into an array.let parsedSet = Set.map(str => {
let obj = {};
str = str.replace(/,$/, '');
let keyValuePairs = str.match(/(\w+):("[^"]+"|\w+)/g);
keyValuePairs.forEach(pair => {
let [key, value] = pair.split(':');
key = key.trim();
value = value.trim();
obj[key] = value.match(/^".*"$/) ? value.slice(1, -1) : Number(value);
});
return obj;
});
console.log(parsedSet);
// Make sure we're only evaluating unique slugs to avoid duplicate entrieslet uniqueSet = [];
let slugMap = {};
for (let item of parsedSet) {
if (!slugMap[item.slug]) {
slugMap[item.slug] = true;
uniqueSet.push(item);
}
}
let sortedSet = uniqueSet.sort((a, b) => b.score - a.score); // Sort the unique set by score
console.log(sortedSet); // Show the output of the whole set.let sortedSlugs = sortedSet.map(item => item.slug);
console.log(sortedSlugs);
output = { sortedSlugs, sortedSet }; // Write the output back to the Zap
We resolve this by asking ChatGPT + the Zapier docs. It should be much easier to handle arrays!
Create a temporary delimiter between values
Converting the input (Zapier Code data input is always a string, so need to convert to an array)
Run a comparison function of unique values
Write back values to map into our onward tool.
let stringSet = inputData.Playbooks;
console.log(stringSet) // Show the ugly string.let Set = stringSet.split('|||'); // Split out by the temporary delimiter
console.log(Set); // Show the array that's fetched
console.log(Array.isArray(Set)) // Evaluates to true// Suspect each line is one long string still.
console.log(Number.isInteger(Set.score)); // Evaluates to false// JSON.parse() was causing problems. GPT alternative suggestion to turn string into an array.let parsedSet = Set.map(str => {
let obj = {};
str = str.replace(/,$/, '');
let keyValuePairs = str.match(/(\w+):("[^"]+"|\w+)/g);
keyValuePairs.forEach(pair => {
let [key, value] = pair.split(':');
key = key.trim();
value = value.trim();
obj[key] = value.match(/^".*"$/) ? value.slice(1, -1) : Number(value);
});
return obj;
});
console.log(parsedSet);
// Make sure we're only evaluating unique slugs to avoid duplicate entrieslet uniqueSet = [];
let slugMap = {};
for (let item of parsedSet) {
if (!slugMap[item.slug]) {
slugMap[item.slug] = true;
uniqueSet.push(item);
}
}
let sortedSet = uniqueSet.sort((a, b) => b.score - a.score); // Sort the unique set by score
console.log(sortedSet); // Show the output of the whole set.let sortedSlugs = sortedSet.map(item => item.slug);
console.log(sortedSlugs);
output = { sortedSlugs, sortedSet }; // Write the output back to the Zap