通过减少javascript获取分组结果的属性

问题描述

在分组结果中,我需要供应商的属性并将其存储在新数组中。但是给我一些错误错误<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.company</groupId> <artifactId>whatever-backend-api</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>Whatever API</name> <description>API for whatever project</description> <url>https://api.company.com/</url> <organization> <name>Company</name> <url>http://www.company.com/</url> </organization> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.8.RELEASE</version> </parent> <properties> <java.version>1.8</java.version> <kotlin.version>1.3.10</kotlin.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <project.scm.id>gitRepo</project.scm.id> <spring-cloud.version>Greenwich.SR3</spring-cloud.version> <springfox.version>2.9.2</springfox.version> <graphql-spring-boot-starter.version>5.10.0</graphql-spring-boot-starter.version> </properties> <distributionManagement> <repository> <id>releasesRepo</id> <url>https://nexus.company.com/repository/maven-releases/</url> </repository> <snapshotRepository> <uniqueVersion>false</uniqueVersion> <id>snapshotsRepo</id> <url>https://nexus.company.com/repository/maven-snapshots/</url> </snapshotRepository> </distributionManagement> <scm> <developerConnection>scm:git:https://gitlab.company.com/root/dev/whatever/whatever-backend-api.git</developerConnection> <tag>HEAD</tag> </scm> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-commons</artifactId> </dependency> <dependency> <groupId>com.kastkode</groupId> <artifactId>springsandwich</artifactId> <version>1.0.2</version> </dependency> <dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>com.graphql-java-kickstart</groupId> <artifactId>graphql-spring-boot-starter</artifactId> <version>${graphql-spring-boot-starter.version}</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${springfox.version}</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${springfox.version}</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.4</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.graphql-java-kickstart</groupId> <artifactId>graphql-spring-boot-starter-test</artifactId> <version>${graphql-spring-boot-starter.version}</version> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <finalName>whatever-api</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>build-info</goal> </goals> <configuration> <additionalProperties> <java.source>${java.version}</java.source> <encoding.source>${project.build.sourceEncoding}</encoding.source> <encoding.reporting>${project.reporting.outputEncoding}</encoding.reporting> </additionalProperties> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.4</version> <configuration> <excludes> <exclude>*MethodAccess</exclude> </excludes> </configuration> <executions> <execution> <id>prepare-agent</id> <goals> <goal>prepare-agent</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> <configuration> <tagNameFormat>@{project.version}</tagNameFormat> </configuration> </plugin> </plugins> </build> </project> 。 如何从分组列表中获取供应商属性? 它即将获得结果并存储在新属性中。

Error: words is not defined

解决方法

const cart = {
  _id: 2,owner: 7,products: [
    {
      _id: {
        $oid: "5f06f9a4b8b878050fbc54b2",},product: 1,vendor: 1,quantity: 2,{
      _id: {
        $oid: "5f06f9a4b8b878050fbc54b3",product: 2,quantity: 1,{
      _id: {
        $oid: "5f06f9a4b8b878050fbc54b4",product: 4,vendor: 2,],createdAt: {
    $date: "2020-06-21T06:46:40.111Z",updatedAt: {
    $date: "2020-07-09T11:04:04.459Z",__v: 0,totalPrice: 265,};

// const result = words.filter((word) => word.length > 6); // useless line,you do not have variable 'words'
const f = cart.products.filter((p) => p.vendor == 1);
const products = cart.products; //better variable naming
var grouped = products.reduce((dictionary,p) => {
  dictionary[p.vendor] = dictionary[p.vendor] || [];
  dictionary[p.vendor].push(p);
  return dictionary;
},{});
for (const p in grouped) {
  console.log(grouped[p]); //is array
}

要修复此代码,只需删除未声明变量words的行即可。

要获得供应商价值: grouped[p]是一个数组。它没有属性vendor。但是您可以通过以下方式获得它:

for (const p in grouped) {
  console.log(grouped[p][0].vendor);
}

或获取其中的一个数组:

let vendors = Object.getOwnPropertyNames(grouped);
,

除了两行代码什么都不做,我认为您正在尝试获取每个组的供应商ID-在这种情况下,这只是日志底部的p

const cart = {"_id":2,"owner":7,"products":[{"_id":{"$oid":"5f06f9a4b8b878050fbc54b2"},"product":1,"vendor":1,"quantity":2},{"_id":{"$oid":"5f06f9a4b8b878050fbc54b3"},"product":2,"quantity":1},{"_id":{"$oid":"5f06f9a4b8b878050fbc54b4"},"product":4,"vendor":2,"quantity":1}],"createdAt":{"$date":"2020-06-21T06:46:40.111Z"},"updatedAt":{"$date":"2020-07-09T11:04:04.459Z"},"__v":0,"totalPrice":265}

//const result = words.filter(word => word.length > 6);
//const f = cart.products.filter(p => p.vendor == 1);
const product = cart.products;
var grouped = product.reduce((dictionary,{})
let vendor;
for (const p in grouped) {
  console.log("vendor=",p," count of items=",grouped[p].length)
}

,

我认为这将为您提供所需的结果:

let f = cart.products.map( p => p.vendor);
let newArray = f.filter((vendor,index,arr)=>vendor!==arr[index+1]);
newArray.forEach(element => {
    console.log(element);
});
,

您的脚本中有一些多余的代码。

const result = words.filter(word => word.length > 6);
,

在第36行上,您写了const result = words.filter(word => word.length > 6);,但是words并没有在代码中的任何地方定义,这就是产生错误的原因。

对于您想要实现的目标,我不确定我是否完全理解,但是,如果我做到了,则可以通过以下方式解决您的问题:

const cart = {
  "_id": 2,"owner": 7,"products": [{
    "_id": {
      "$oid": "5f06f9a4b8b878050fbc54b2"
    },"product": 1,"vendor": 1,"quantity": 2
  },{
    "_id": {
      "$oid": "5f06f9a4b8b878050fbc54b3"
    },"product": 2,"quantity": 1
  },{
    "_id": {
      "$oid": "5f06f9a4b8b878050fbc54b4"
    },"product": 4,"vendor": 2,"quantity": 1
  }],"createdAt": {
    "$date": "2020-06-21T06:46:40.111Z"
  },"updatedAt": {
    "$date": "2020-07-09T11:04:04.459Z"
  },"__v": 0,"totalPrice": 265
}

const products = cart.products;

const vendors = products
  .map(product => product.vendor)
  .reduce((vendors,vendor) => {
    if (vendors.indexOf(vendor) < 0) {
      vendors.push(vendor);
    }
    return vendors;
  },[]);

const productsByVendor = products.reduce((dictionary,{});
console.log('Products grouped by vendor:\n',productsByVendor);

// in 'productsByVendor' the vendors are the keys of your object
console.log('Vendors:',Object.keys(productsByVendor));

/* if you want to retrieve the vendor of a specific product from 'productsByVendor'
 * Assumptions:
 * 1. cart.products[n].product is assumed to be a unique id (if that is not the case,you can use cart.products[n]._id instead)
 * 2. I am assuming that each product can be sold by only one vendor; if a product can be sold by more than one vendor you'll have to adjust a bit the function 
 */
getVendorIdFromGroupedProducts = (productId) => {
  for (let key of Object.keys(productsByVendor)) {
    for (let prod of productsByVendor[key]) {
      if (prod.product === productId) {
        return prod.vendor
      }
    }
  }
  return 'The product does not exist'
};
console.log('Vendor of product 1 is:',getVendorIdFromGroupedProducts(1));
console.log('Vendor of product 2 is:',getVendorIdFromGroupedProducts(2));
console.log('Vendor of product 3 is:',getVendorIdFromGroupedProducts(3));
console.log('Vendor of product 4 is:',getVendorIdFromGroupedProducts(4));