我需要JS数组任务的帮助。
我有一个看起来像这样的数组:
const array = [
{name: 'Show_Everything__c', controllerName: null, value: true},
{name: 'Vehicle_Type__c', controllerName: 'Show_Everything__c', value: "Car"},
{name: 'Car__c', controllerName: 'Vehicle_Type__c', value: "BMW"},
{name: 'Model__c', controllerName: 'Car__c', value: '330i'}
];
我有一个表示其中一个对象名称的键。
我想要实现的是:
如果我key=Vehicle_Type__c
,我想检查Vehicle_Type__c是否作为 controllerValue 存在于对象数组中的某个地方,如果存在,则将其添加到新数组中,并且(基于此示例(因为Vehicle_Type__c存在于名为 Car__c 的对象上,现在我想检查Car__c是否存在作为控制器名称的某个地方。
所以我想要一个包含const newArray = [Car__c, Model__c ]
的数组
我现在有类似的东西:
const dependentField = array.find(field => field.controllerName === key).name;
const dependentField_2 = array.find(field => field.controllerName === dependentField).name;
const dependentField_3 = array.find(field => field.controllerName === dependentField_2).name;
但我想有一些通用的东西,没有逻辑重复。
任何想法或例子将不胜感激,非常感谢。
您可以创建一个函数来进行该搜索并以递归方式调用它。
解决方案 1
简单的代码,理解逻辑(此解决方案将修改初始全局变量(
// Your data
const array = [
{name: 'Show_Everything__c', controllerName: null, value: true},
{name: 'Vehicle_Type__c', controllerName: 'Show_Everything__c', value: "Car"},
{name: 'Car__c', controllerName: 'Vehicle_Type__c', value: "BMW"},
{name: 'Model__c', controllerName: 'Car__c', value: '330i'}
];
// The final array with all founded names
const newArray = [];
// Your recursive function
const findName = (value) => {
array.forEach((item) => {
if (item.controllerName === value) {
// If the key exists, save in the array and make a new search with this key
newArray.push(item.name);
findName(item.name);
}
})
}
// Starts the application by calling the fuction with the initial desired value
findName("Vehicle_Type__c");
// Check the results
console.log(newArray);
解决方案 2
使用不变性原则的更复杂的方法
// Your data
const array = [
{name: 'Show_Everything__c', controllerName: null, value: true},
{name: 'Vehicle_Type__c', controllerName: 'Show_Everything__c', value: "Car"},
{name: 'Car__c', controllerName: 'Vehicle_Type__c', value: "BMW"},
{name: 'Model__c', controllerName: 'Car__c', value: '330i'}
];
// Your filter function
const findName = (value) => {
const filteredData = array.filter(item => item.controllerName === value);
const filteredName = filteredData.map(item => item.name);
return filteredName;
}
// Your recursive and immutable function
const findDependencies = (acc, keyValue) => {
const results = findName(keyValue);
if (results.length > 0) {
return results.map((item) => {
return findDependencies([...acc, ...results], item);
}).flat();
} else {
return acc;
}
}
// Starts the application by calling the fuction with the initial desired value
const newArray = findDependencies([], "Show_Everything__c");
// Check the results
console.log(newArray);
您可以将数组缩减为参数列表中的数组,并用新名称递归调用它,直到没有更多名称。
const array = [
{name: 'Show_Everything__c', controllerName: null, value: true},
{name: 'Vehicle_Type__c', controllerName: 'Show_Everything__c', value: "Car"},
{name: 'Car__c', controllerName: 'Vehicle_Type__c', value: "BMW"},
{name: 'Model__c', controllerName: 'Car__c', value: '330i'}
];
const controllerNames = (array, ...controllers) => {
const names = array.reduce((names, item) => controllers.some(c => item.controllerName === c) ? [...names, item.name] : names, []);
return names.length ? [...names, ...controllerNames(array, ...names)] : names;
};
console.log(controllerNames(array, 'Vehicle_Type__c'));
阵列是第一个参数和...扩展运算符将其余参数收集到一个数组中。如果当前控制器名称位于控制器数组中,则减少外观并返回具有其名称的新数组或返回现有名称。[] 是空名称数组的起始累加器。