Javascript/Typescript:根据其他对象的条件在对象中附加值的最佳方式



更新的对象密钥

let conditionedObject = {
"isNameRequired": true,
"isCityRequired": false,
"isPostRequired": true
};

let myTotalData = {
data: {
"givenName": 'myname',
"street":"mystreet",
"cityName": 'mycity',
"postcode": 'mypost'
}
};
let resultData = {};

conditionedObject和myTotalData都来自不同的来源。我想知道基于conditionedObject创建新对象的最佳方法,例如,我的conditionedObject说我只需要名称帖子,所以我的resultData应该返回{"givenName":"myname","postcode":"mypost"}

conditionedObject.isNameRequired用于myTotalData.data.givenNameconditionedObject.isPostRequired适用于myTotalData.deata.postcodeconditionedObject.isCityRequired用于myTotalData.data.cityName,所有这些都将说明是否需要将myTotalData键放置在新对象中。

提前感谢所有的建议并帮助

您可以使用Array.prototype.reduce((:

在这种情况下,我建议您创建一个新对象来存储属性之间的关系:


let conditionedObject = {
"isNameRequired": true,
"isCityRequired": false,
"isPostRequired": true
};
let myTotalData = {
data: {
"givenName": 'myname',
"street":"mystreet",
"cityName": 'mycity',
"postcode": 'mypost'
}
};
const reference = {
"isNameRequired": "givenName",
"isCityRequired": "cityName",
"isPostRequired": "postcode"
}
let resultData = {};
resultData =Object.entries(conditionedObject).reduce((obj, [key, value]) => {
if(value && myTotalData.data[reference[key]]) {
const prop = reference[key]; 
obj[prop] = myTotalData.data[prop];
}
return obj;
}, {});
console.log(resultData);

这是我的解决方案:

您需要更改对象conditionedObject中的键并删除is-前缀,以便它们与myTotalData中的键相同。这样以后检查更容易。

然后它是相当直接的。

let conditionedObject: {[key: string]: boolean} = {
"isName": true,
"isCity": false,
"isPost": true
};
type DataType = {[key: string]: string};
let myTotalData: DataType = {
"name": 'myname',
"city": 'mycity',
"post": 'mypost'
};
let resultData: DataType = {};
for(const key in conditionedObject) {
// Ensure that the key is really part of this object
if(!conditionedObject.hasOwnProperty(key)) {
continue;
}

if(!conditionedObject[key]) {
continue;
}

const dataKey = key.startsWith("is")
? key.charAt(2).toLowerCase() + key.substring(3)
: key;
if(myTotalData.hasOwnProperty(dataKey)) {
resultData[dataKey] = myTotalData[dataKey];
}
}
console.log(resultData);

输出:

{
name: "myname",
post: "mypost"
}

如果您可以确保conditionedObject键始终等于您的myTotalData键,但大写并带有"是";正面:

let capitalize = str => str.charAt(0).toUpperCase() + str.slice(1)
let prependIs = str => "is" + str
let conditionedObject = {
"isName": true,
"isCity": false,
"isPost": true
};
let myTotalData = {
"name": 'myname',
"city": 'mycity',
"post": 'mypost'
};
let filterData = (data, conditionObj) => Object.fromEntries(Object.entries(data)
.filter(([key, _]) => conditionObj[prependIs(capitalize(key))]))
// More verbose alternative for browsers which doesn't support `Object.fromEntries()`
let filterDataAlt = (data, conditionObj) => {
let result = {}
let filteredEntries = Object.entries(data)
.filter(([key, _]) => conditionObj[prependIs(capitalize(key))])
for (let [key, value] of filteredEntries) {
result[key] = value
}
return result
}
console.log(filterData(myTotalData, conditionedObject))
console.log(filterDataAlt(myTotalData, conditionedObject))

最新更新