如何在javascript数组中过滤对象并获得所需的输出?

如何在javascript数组中过滤对象并获得所需的输出?,javascript,ecmascript-6,Javascript,Ecmascript 6,我有一个像这样的对象数组 [ {imgUrl: "A"}, {imgUrl: "B"}, {imgUrl: "C", file: {fileName: "D"} } ] 期望输出=[“A”、“B”、“D”] 您可以尝试使用map数组的方法 var输入=[ {imgUrl:“A”}, {imgUrl:“B”}, {imgUrl:“C”,文件:{fileName:“D”} ]; var输出=input.map(函数(项){ 返回item.file ?item.file.fileN

我有一个像这样的对象数组

[
  {imgUrl: "A"},
  {imgUrl: "B"},
  {imgUrl: "C", file: {fileName: "D"} }  
]

期望输出=[“A”、“B”、“D”]

您可以尝试使用
map
数组的方法

var输入=[
{imgUrl:“A”},
{imgUrl:“B”},
{imgUrl:“C”,文件:{fileName:“D”}
];
var输出=input.map(函数(项){
返回item.file
?item.file.fileName
:item.imgUrl;
});

console.log(output)
如果我理解正确,您想要值数组的imgUrl,除非存在文件名?如果是这种情况,有很多方法可以实现这一点,但是使用,您可以执行以下操作:

test = [
  {imgUrl: "A"},
  {imgUrl: "B"},
  {imgUrl: "C", file: {fileName: "D"}},  
]

output = test.reduce((acc, obj) => {
  return acc.concat([obj.file && obj.file.fileName || obj.imgUrl])
}, [])
这里的| |语句将在obj.file存在时对obj.file.fileName进行优先级排序:如果它是一个有效值,它将只返回该值,但如果该值为,它将取而代之的是obj.imgUrl的值

关于“Falsy”的旁注: 如果你要考虑什么空字符串或零值或任何值作为有效值,你可以用< /P>替换“*”语句。 i、 e。 条件if\u true\u返回值:if\u false\u返回值

在这种情况下:


(obj.(“文件”)和&obj.file.fileName)?obj.file.fileName:obj.imgUrl

当您需要具有某种优先级的属性时,始终可以创建代理来处理这些情况。不过对于这种情况,我不建议这样做。这个答案只是一个例子

//get handler参数(t,p)是目标(arr)的t,属性的p是属性
//我们正在尝试获取的数组的。这可以是0作为索引或函数名
const arr=[{a:“a”},{a:“B”},{a:“C”,B:“D”}];
const arrP=new Proxy(arr,{//add get Proxy name以返回名称映射
get:(t,p)=>p==“名称”?t.map(o=>o.b?o.b:o.a):t[p]
}
);
控制台日志(arrP.names);


Hi,这不是有效的对象。有语法错误,真的吗?你能解释一下吗?@kaws一个JavaScript对象是命名值的集合,这里你只有数组,没有键值对不是一个有效的对象,请用有效的对象回复,然后很容易解析并得到你想要的。你可能混合了[]和{}有更好的方法吗?好吧,在阵列上使用
reduce
方法是相当先进的。你还期望什么?你也可以使用
map
,对于那种需求也是一样的。你能解释一下这行吗?结果.push(item.fileName?item.fileName:item.imgUrl);如果定义了结果数组,则将其推入
item.fileName
,否则将其推入
item.imgUrl
。我希望a、b和d作为输出nx。我只是注意到我的编辑器中的对象与我在这里发布的对象不同。我修改了我的问题。你的答案没有解决问题。@kaws不需要大的改变。你能解释一下,下面的方法是什么吗?返回item.file?item.file.name:item.imgUrl@这是条件(三元运算符)。通常,如果
item.file
是truthy,则返回它的
fileName
属性值。否则会返回
imgUrl
。你能用小提琴运行这个吗?很好的解释。我只是注意到我的编辑器中的对象与我在这里发布的对象不同。我修改了我的问题。你的答案没有解决问题。请检查这把小提琴。我怀疑你已经找到了答案,但为了更深层次地找到答案,你只需使用
obj.file.fileName
而不是
obj.fileName
,因为你想在由键“file”Woops表示的对象值中找到键“fileName”表示的值,很抱歉,如果您仍然需要它,请在上面修复,这里有一把小提琴:Tnx。我只是注意到我的编辑器中的对象与我在这里发布的对象不同。我修改了我的问题。你的回答没有解决问题。
test = [
  {imgUrl: "A"},
  {imgUrl: "B"},
  {imgUrl: "C", file: {fileName: "D"}},  
]

output = test.reduce((acc, obj) => {
  return acc.concat([obj.file && obj.file.fileName || obj.imgUrl])
}, [])