我必须通过值在对象数组中找到一个属性,这是一个字符串列表。
例如,我有这样的东西:
const colors ={
colors-1: [{color: 'blue'}],
colors-2: [{color: 'gray'}, {color: 'red'}],
colors-3: [{color: 'white'}]
}例如,我想通过字符串获得属性colors-2,它在数组值中。
就像这样:
findPropertyByValue(colors, 'red')和产出:
'colors-2'你能告诉我如何做到这一点吗?谢谢。
发布于 2022-03-27 14:09:50
下面是使用find和some的解决方案。
它接受colors对象的条目,并找到具有输入颜色的元素的条目。
查找返回一个带有[key,value]的条目,因此要获取键,请使用第0元素
在这里,我假设一种颜色有一个独特的键。
在?.之前添加了[0] (只有在可用的情况下可选链接访问),这样当输入未找到的颜色时,就不会出现错误(返回undefined)。||操作符用于在查找步骤返回undefined时返回类似于"not“的消息
const colors ={
'colors-1': [{color: 'blue'}],
'colors-2': [{color: 'gray'}, {color: 'red'}],
'colors-3': [{color: 'white'}]
}
const findPropertyByValue = (obj,col) => Object.entries(obj).find(([k,v])=>v.some(({color}) => color===col))?.[0] || 'not found'
console.log(findPropertyByValue(colors,'white'))
console.log(findPropertyByValue(colors,'gray'))
console.log(findPropertyByValue(colors,'red'))
console.log(findPropertyByValue(colors,'blue'))
console.log(findPropertyByValue(colors,'green'))
发布于 2022-03-27 14:05:57
以下是你如何实现你想要的。注意,我在引号中添加了对象键,因为它们包含-,所以不会以其他方式工作。
const colors = {
"colors-1": [{ color: "blue" }],
"colors-2": [{ color: "gray" }, { color: "red" }],
"colors-3": [{ color: "white" }]
};
function findPropertyByValue(colors, value) {
for (let color in colors) {
if (colors[color].some((c) => c.color == value)) {
return color;
}
}
return ""; // if there isn't one
}
console.log(findPropertyByValue(colors, "red"));
发布于 2022-03-27 14:11:04
你可以试试这个:
const colors = {
"colors-1": [{ color: "blue" }],
"colors-2": [{ color: "gray" }, { color: "red" }],
"colors-3": [{ color: "white" }],
};
function findPropertyByValue(obj, colorName) {
return Object.entries(obj).find((entry) =>
entry[1].some((color) => color.color === colorName)
)?.[0];
}
console.log(findPropertyByValue(colors, "red"));
console.log(findPropertyByValue(colors, "not in list"));此解决方案将返回所有指定颜色的字段:
const colors = {
"colors-1": [{ color: "blue" }],
"colors-2": [{ color: "gray" }, { color: "red" }],
"colors-3": [{ color: "white" }],
"colors-4": [{ color: "white" }, { color: "red" }],
};
function findPropertyByValue(obj, colorName) {
return Object.entries(obj).reduce(
(acc, entry) =>
entry[1].some((color) => color.color === colorName)
? [...acc, entry[0]]
: acc,
[]
);
}
console.log(findPropertyByValue(colors, "red"));
console.log(findPropertyByValue(colors, "not in list"));https://stackoverflow.com/questions/71636951
复制相似问题