代码之家  ›  专栏  ›  技术社区  ›  arunmmanoharan

基于2个键的属性减少数组

  •  0
  • arunmmanoharan  · 技术社区  · 6 年前

    我有一个这样的数组。

    var data = [{
      name: 'Apple',
      category: 'Fruit',
      value: 12
    }, {
      name: 'Apple',
      category: 'Fruit',
      value: 20
    }, {
      name: 'Orange',
      category: 'Fruit',
      value: 65
    }, {
      name: 'Orange',
      category: 'Fruit',
      value: 40
    }]
    

    我需要一个这样的数组:

    var newData = [{
      name: 'Apple',
      category: 'Fruit',
      value: 20
    }, {
      name: 'Orange',
      category: 'Fruit',
      value: 65
    }]
    

    即获取数组中每个“name”键的最大值。

    var data = [{
      name: 'Apple',
      category: 'Fruit',
      value: 12
    }, {
      name: 'Apple',
      category: 'Fruit',
      value: 20
    }, {
      name: 'Orange',
      category: 'Fruit',
      value: 65
    }, {
      name: 'Orange',
      category: 'Fruit',
      value: 40
    }]
    
    console.log(data.reduce(function(prev, current) {
      return (prev.name !== current.name && prev.value > current.value) ? prev : current
    }))

    请给我建议。

    4 回复  |  直到 6 年前
        1
  •  4
  •   CertainPerformance    6 年前

    你需要跟踪当前的最高点 value 每一个 name 名称 价值

    var data = [{
      name: 'Apple',
      category: 'Fruit',
      value: 12
    }, {
      name: 'Apple',
      category: 'Fruit',
      value: 20
    }, {
      name: 'Orange',
      category: 'Fruit',
      value: 65
    }, {
      name: 'Orange',
      category: 'Fruit',
      value: 40
    }];
    
    console.log(Object.values(
      data.reduce((a, item) => {
        const { name, value } = item;
        if (!a[name] || a[name].value < value) a[name] = item;
        return a;
      }, {})
    ));

    (您的 prev.name !== current.name ... 只有当你只想 因为你需要更多,所以你需要一个可以包含多个项目的对象。)

        2
  •  0
  •   brk    6 年前

    使用reduce并检查累加器阵列是否与使用reduce的结果相同 findIndex

    var data = [{
      name: 'Apple',
      category: 'Fruit',
      value: 12
    }, {
      name: 'Apple',
      category: 'Fruit',
      value: 20
    }, {
      name: 'Orange',
      category: 'Fruit',
      value: 65
    }, {
      name: 'Orange',
      category: 'Fruit',
      value: 40
    }]
    
    
    
    let result = data.reduce(function(acc, curr) {
    
      let findIfExist = acc.findIndex(elem => {
        return elem.name === curr.name;
      })
      if (findIfExist === -1) {
        acc.push(curr)
      } else {
        if (acc[findIfExist].value < curr.value) {
          acc[findIfExist].value = curr.value
        }
    
      }
    
      return acc;
    
    }, [])
    
    console.log(result)
        3
  •  0
  •   Ramesh César Landesa    6 年前

    使用 forEach reduce

    var data = [{
      name: 'Apple',
      category: 'Fruit',
      value: 12
    }, {
      name: 'Apple',
      category: 'Fruit',
      value: 20
    }, {
      name: 'Orange',
      category: 'Fruit',
      value: 65
    }, {
      name: 'Orange',
      category: 'Fruit',
      value: 40
    }]
    
    let result = {};
    data.forEach(function(current) {
      if (result[current.name] &&
        result[current.name].value < current.value &&
        result[current.name].category === current.category) {
        result[current.name].value = current.value;
      } else if (!result[current.name]) {
        result[current.name] = current;
      }
    });
    console.log(Object.values(result));
        4
  •  0
  •   Monica Acha    6 年前

    var data = [{
      name: 'Apple',
      category: 'Fruit',
      value: 12
    }, {
      name: 'Apple',
      category: 'Fruit',
      value: 20
    }, {
      name: 'Orange',
      category: 'Fruit',
      value: 65
    }, {
      name: 'Orange',
      category: 'Fruit',
      value: 40
    }]
    let result=data.reduce(function(temp, current) {
      //check if temp has object
      var found = temp.some((el) => {
          return el.name === current.name
        });
      //if not found, add the object
        if (!found) { temp.push(current) }
      //if found and value is greater, replace the max value
      else{
        temp.find((element) => {
         if(element.name === current.name && element.value<current.value)
        element.value=current.value
        })
      }
      return temp
    },[])
    console.log(result);