简体   繁体   English

如何从特定数组中获取新数组

[英]How to get a new array from a specific array

How do I get a new array from a specific array? 如何从特定阵列中获取新阵列?

I don't known how to handle an Array like this: 我不知道如何处理这样的数组:

let arr1 = [
  {name: 'a', age: 1},
  {name: 'a', age: 2},
  {name: 'a', age: 3},
  {name: 'b', age: 1},
  {name: 'b', age: 2}
  {name: 'b', age: 3}
  {name: 'c', age: 1}
  {name: 'c', age: 2}
  ...
]

"I want this result: from each item with the same name , pick biggest age value" “我想要这个结果:从每个具有相同name ,选择最大age值”

let arr2 = [
  {name: 'a', age: 3},
  {name: 'b', age: 3},
  {name: 'c', age: 2} 
  ...
]

Just use filter to select all items with the highest age for their name . 只需使用filter选择所有age最长的项目作为其name

 let arr1 = [{name:'a',age:1},{name:'a',age:2},{name:'a',age:3},{name:'b',age:1},{name:'b',age:2},{name:'b',age:3}]; const biggest = arr1.reduce((a, { name, age }) => { a[name] = a[name] || age; age > a[name] ? a[name] = age : a[name]; return a; }, {}); let arr2 = arr1.filter(({ name, age }) => biggest[name] == age); console.log(arr2); 
 .as-console-wrapper { max-height: 100% !important; top: auto; } 

You can use a combination of reduce and Object.values 您可以结合使用reduceObject.values

  const arr1 = [ {name: 'a', age: 1}, {name: 'a', age: 2}, {name: 'a', age: 3}, {name: 'b', age: 1}, {name: 'b', age: 2}, {name: 'b', age: 3}, {name: 'c', age: 1}, {name: 'c', age: 2}, ] const maxNames = arr1.reduce((maxNamesObject, item) => { const { name, age } = item const maxItem = maxNamesObject[name] if (!maxItem || age > maxItem.age) { maxNamesObject[name] = item } return maxNamesObject }, {}) const output = Object.values(maxNames) console.log(output) 

Extracted from this answer: How to filter object array based on attributes? 从以下答案中提取: 如何根据属性过滤对象数组?

You can use the Array.prototype.filter method: 您可以使用Array.prototype.filter方法:

let arr2 = arr1.filter(function (obj) {
  return obj.age === 3;
});

This is a more beautiful solution: 这是一个更漂亮的解决方案:

 let arr1 = [ {name: 'a', age: 1}, {name: 'a', age: 2}, {name: 'a', age: 3}, {name: 'b', age: 1}, {name: 'b', age: 2}, {name: 'b', age: 3}, {name: 'c', age: 1}, {name: 'c', age: 2}, ] arr2 = Array.from(new Set(arr1.map(e => e.name))).map(e => { return { name: e, age: Math.max(...arr1.filter(ee => ee.name == e).map(ee => ee.age)) } }) console.log(arr2) 

Blockquote 大段引用

my solution: 我的解决方案:

 const arr1 = [ {name: 'a', age: 1}, {name: 'a', age: 2}, {name: 'a', age: 3}, {name: 'b', age: 1}, {name: 'b', age: 2}, {name: 'b', age: 3}, {name: 'c', age: 1}, {name: 'c', age: 2}, ] let arr2 = arr1.reduce((acc, item) => { let objectExists = acc.find(e => e.name === item.name) if (!objectExists) acc.push(item) else if (objectExists.age < item.age) { acc[acc.indexOf(objectExists)].age = item.age } return acc }, []) console.log(arr2) 

I didn't notice you update the question. 我没有注意到您更新了问题。 This is not the most pro code. 这不是最专业的代码。

  let arr1 = [ {name: 'a', age: 1}, {name: 'a', age: 2}, {name: 'a', age: 3}, {name: 'b', age: 1}, {name: 'b', age: 2}, {name: 'b', age: 3}, {name: 'c', age: 1}, {name: 'c', age: 2} ]; let names = []; let output = []; for(obj of arr1){ if (!names.includes(obj.name)) names.push(obj.name); } for(obj of names){ let current = arr1.filter(x => x.name === obj) .reduce((a,b) => a.age > b.age ? a : b); output.push(current); } console.log(output); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM