根据动态传递的属性从对象数组中获取唯一值

时间:2019-07-04 12:17:43

标签: javascript typescript ecmascript-6

在这种情况下,我需要根据动态传递的属性获取所有对象的唯一值。我尝试了以下方法,但似乎不起作用。

var arr = [
  {
    id: "1",
    type: "x",
    source: {
      val1: "3",
      val2: "4",
      val3: "6",
    },
  },
  {
    id: "1",
    type: "x",
    source: {
      val1: "3",
      val2: "4",
      val3: "6",
    },
  },
  {
    id: "1",
    type: "x",
    source: {
      val1: "4",
      val2: "5",
      val3: "6",
    }
  }
];

现在说我通过val1,它应该给我唯一的值3,4,如果我通过val2,它应该给我4,5。 附言:我只会传递源属性中存在的参数。

我尝试过的方法:

 calculate = (param) =>
 {
   let uniqueValues = Array.from(
        new Set(arr.map((arr: any) => arr[param]))
   );
 }

2 个答案:

答案 0 :(得分:2)

看起来,您还需要source属性。

new Set(arr.map((o: any) => o.source[param]))

答案 1 :(得分:0)

您可以使用map来获取源值,然后使用reduce来获取不正确的值:

const arr = [
  {
    id: "1",
    type: "x",
    source: {
      val1: "3",
      val2: "4",
      val3: "6",
    },
  },
  {
    id: "1",
    type: "x",
    source: {
      val1: "3",
      val2: "4",
      val3: "6",
    },
  },
  {
    id: "1",
    type: "x",
    source: {
      val1: "4",
      val2: "5",
      val3: "6",
    }
  }
];

function calculate(data, param) {
  return data.map(x => {
    return (x.source || {})[param];
  }).reduce((acc, val) => {
    if (acc.indexOf(val) === -1)
      acc.push(val);
    return acc;
  }, []);
}

console.log(calculate(arr, "val1"));
console.log(calculate(arr, "val2"));