如何从数组对象的数组中获取特定属性?

时间:2018-09-18 15:41:24

标签: javascript arrays reactjs

我有一个数组数组,每个数组都由对象组成。这是我所指的简化版本(它是我原始数组的console.log)-

Array - [Array(2), Array(3), Array(2)]

每个数组都具有以下格式的对象(从上方获取第一个数组)-

Array(2) - 
0: {name: "test", score:40, date: "2018-09-18T00:00:00.000Z"}
1: {name: "test2", score:50 date: "2018-09-18T00:00:00.000Z"}

其他数组相似,但具有相同的属性和不同的值。

我正在尝试从每个对象中获取name属性。我尝试了以下代码-但最终得到的是未定义的值:

    const test1= array1.map(x=> x.values) // this gives me the array of arrays
    const test2 = test1.map(function(y){return y.name})// this is my attempt to get the 'name' attribute from all of the arrays that include the objects.

我在这里错过了什么?有没有更好的方法使用箭头函数来获取属性?

7 个答案:

答案 0 :(得分:4)

平铺,然后map将其命名为反之亦然

首先展平,然后map

const array = [[{name: 'test1'}, {name: 'test2'}], [{name: 'test3'}, {name: 'test4'}]]

var res = [].concat(...array).map(({name})=>name);
console.log(res);

现在,map命名为名称,然后展平

const array = [[{name: 'test1'}, {name: 'test2'}], [{name: 'test3'}, {name: 'test4'}]]

var res = [].concat(...array.map(a=>a.map(b=>b.name)))
console.log(res);

现在,在这一步中,您肯定会注意到我们实际上在每个级别上对其进行映射(我们必须采用仅映射的方法,而无需其他方式。因此,我们可以执行reduce来代替外部地图,并将其concat放在那里,所以我们可以避免外部concat(用于展平),而内部concat实际上将其展平。我们去:

const array = [[{name: 'test1'}, {name: 'test2'}], [{name: 'test3'}, {name: 'test4'}]]

var res = array.reduce((r, a)=>r.concat(a.map(b=>b.name)), []);
console.log(res);

答案 1 :(得分:2)

enter code here

def spiral(a,ce,re):#a= matrix: ce=End of column: re = end of row

    c=0  #c=starting of column
    r=0  #r=starting of row
    while(c<ce and r<re):
        for i in range(r,re):
            print(a[i][r],end=' ')
        c += 1
        for i in range(c,ce):
            print(a[re-1][i],end=" ")
        re -= 1
        if(c<ce): #checks if columns exausted
            for i in range(re-1,r-1,-1):
                print(a[i][ce-1],end=' ')
        ce -= 1
        if(r<re): #checks if rows exausted
            for i in range(ce-1,c-1,-1):
                print(a[r][i],end=' ')        
        r+=1

    #function ended        

a=[]
n=int(input(""))
for j in range(n):
    temp=[]
    temp=list(map(int,(input().split())))      
    a.append(temp)
spiral(a,n,n)

答案 2 :(得分:1)

因为在第一个映射x中是数组,而不是对象。因此,没有value。您应该映射内部数组,然后获得所需的值。

const arr = [
  [
    {
      name: "test",
      score: 40,
      date: "2018-09-18T00:00:00.000Z"
    },
    { name: "test2", score: 50, date: "2018-09-18T00:00:00.000Z" }
  ],
  [
    {
      name: "foo",
      score: 40,
      date: "2018-09-18T00:00:00.000Z"
    },
    { name: "bar", score: 50, date: "2018-09-18T00:00:00.000Z" }
  ]
];

const test1 = arr
  .map(x => x.map(y => y.name))
  .reduce((acc, el) => [...acc, ...el], []);


console.log(test1);

答案 3 :(得分:0)

这里:

DataSource

您可以使用flat()将名称保留在数组中,也可以使用join()将名称合并为字符串。

答案 4 :(得分:0)

这应该工作正常。您需要展平数组结构并映射名称。

const array = [[{name: 'test1'}, {name: 'test2'}], [{name: 'test3'}, {name: 'test4'}]]

const names = array.reduce((acc, innerArray) => {
  return [...acc, ...innerArray.map(entry => entry.name)]
}, [])

console.log(names)

答案 5 :(得分:0)

考虑到map返回一个数组;你遍历它。过滤或减少操作。

const test1= array1.map(x=> x.values) // x doesn't have a property named  "value"
//simply use forEach
array1.forEach((el) => console.log(el.name))

如果要在集合中捕获名称:

const let container = [];
array1.forEach((el) => container.push(el.name))

更好地了解此迭代器功能的一种好方法是首先使用循环,然后尝试将您的代码“翻译”为其中一个。

答案 6 :(得分:0)

const test1= array1.map(x=> x.values)

这返回未定义。

let requiredArr = [];

let array1 = [Array(2), Array(3), Array(2)]

let test2 = array1.map(x => x.map(y => requiredArr(y.name));

test2将给出所需的结果。