Оператор распространения по массиву объектов в машинописном тексте - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь использовать spread operator, чтобы найти уникальный набор на этом

let obj = {
  requests: [{
      id: 'p1',
      isOptional: false,
      item: [Object]
    },
    {
      id: 'p1',
      isOptional: false,
      item: [Object]
    }
  ]
};

// I tried below.
let output = [...new Set(obj.requests)];
console.log(output);

Но это не сработало.

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Вы можете получить ответ на свой вопрос отсюда Как получить различные значения из массива объектов в JavaScript? . Ниже приводится объяснение, почему это не сработало так, как вы ожидали.

Вы не можете найти unique objects с использованием Set, если оба object не имеют same ссылка. Итак, в вашем случае кажется, что у вас есть два разных references для objects внутри массива. Таким образом, Set вернет 2 values.

Если у вас есть same reference для обоих objects (например, let o = {id: 'p1' , isOptional: false, item: [Object]}) и let obj = {requests: [o, o]} , тогда он вернет уникальные значения.

Вы можете проверить то же самое на Set, как показано на скриншоте ниже. image

let o = {
  id: 'p1',
  isOptional: false,
  item: {
    id: 10
  }
};

let obj = {
  requests: [o, o]
}

let output = [...new Set(obj.requests)];
console.log('Output with unique reference');
console.log(output);

let o2 = {
  id: 'p1',
  isOptional: false,
  item: {
    id: 10
  }
};

let obj2 = {
  requests: [o, o2]
}
let output2 = [...new Set(obj2.requests)];
console.log('Output with different references');
console.log(output2);

0 голосов
/ 04 августа 2020

Вы можете сделать это, используя filter или spread Operator с map. Простое использование оператора распространения с new Set не даст желаемых результатов.

Использование filter

var data = {
  requests: [{
      id: 'p1',
      isOptional: false,
      item: [Object]
    },
    {
      id: 'p1',
      isOptional: false,
      item: [Object]
    }
  ]
}

var unique = data.requests.filter(function({id}) {
  return !this[id] && (this[id] = id)
}, {})

console.log(unique )

Использование оператора распространения и map

var data = {
  requests: [{
      id: 'p1',
      isOptional: false,
      item: [Object]
    },
    {
      id: 'p1',
      isOptional: false,
      item: [Object]
    }
  ]
}

var unique = [...new Set(data.requests.map(({id}) => id))].map(e => data.requests.find(({id}) => id == e)); 

console.log(unique )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...