2017-04-07 41 views
1
let products = [ 
{ 
    "name": "Lenovo", 
    "price": "18000", 
    "model": "v580c" 
}, 
{ 
    "name": "Apple", 
    "price": "30000", 
    "model": "Iphone 6" 
}, 
{ 
    "name": "Nikon", 
    "price": "25000", 
    "model": "G290" 
}] 

我需要使用getProduct函數過濾我的products函數,該函數接受可變參數列表。 參數可以是所述的minPricemaxPrice產物的名稱和/或價格,和/或模型過濾可變參數的東西

function getProduct(productName, minPrice, maxPrice, productModel) { 

    return products.filter(product => { 
     return product.price < maxPrice && product.price > minPrice && product.name == productName; 
    }); 
} 

console.log(getProduct("Apple", 3540, 3000000000)); 
console.log(getProduct("Lenovo", 3540, 3000000000, "v580c")); 

回答

1

您可以發送一個params數組作爲參數並編寫一個邏輯來相應地處理它們。

樣品:

function getProduct(array, params){ 
 
    var list = array.filter(function(o){ 
 
    return params.every(function(kv){ 
 
     if(o.hasOwnProperty(kv.key)){ 
 
     var cur = o[kv.key]; 
 
     switch (kv.operation){ 
 
      case ">":  return cur > kv.value 
 
      case "<":  return cur < kv.value 
 
      case "in": return cur.indexOf(kv.value) > -1 
 
      case "regex": return kv.value.test(cur) 
 
      default:  return cur === kv.value 
 
     } 
 
     } 
 
    }) 
 
    }); 
 
    
 
    console.log(list); 
 
    return list; 
 
} 
 

 
var products=[{name:"Lenovo",price:"18000",model:"v580c"},{name:"Apple",price:"30000",model:"Iphone 6"},{name:"Nikon",price:"25000",model:"G290"}]; 
 

 
getProduct(products, [{key:"name", value: "Nikon"}]) 
 
getProduct(products, [ 
 
    {key:"price", value: 20000, operation: ">"}, 
 
    {key:"price", value: 40000, operation: "<"} 
 
]) 
 

 
getProduct(products, [{key:"name", value: "e", operation: "in"}]) 
 
getProduct(products, [{key:"model", value: /\d{2,}/g, operation: "regex"}])

1

您可以使用一個對象具有特殊結構的搜索,如果你需要牛逼搜索多個項目。這個建議使用一個對象,通過這種結構過濾:

{ 
    name: 'Apple', 
    price: { 
     min: 3540, // both or a single border is possible 
     max: 60000 
    }, 
    model: function (s) { return s.match(/s/); } // just search for a single letter 
} 

的算法會在search每個屬性,如果所有比較屬實,則該元素被添加到結果集。

function filter(array, search) { 
 
    return array.filter(function (a) { 
 
     return Object.keys(search).every(function (k) { 
 
      return (
 
       a[k] === search[k] || 
 
       typeof search[k] === 'object' && (
 
        ('min' in search[k]) && ('max' in search[k]) && search[k].min <= a[k] && a[k] <= search[k].max || 
 
        ('min' in search[k]) !== ('max' in search[k]) && (search[k].min <= a[k] || a[k] <= search[k].max) 
 
       ) || 
 
       typeof search[k] === 'function' && search[k](a[k]) 
 
      ); 
 
     }); 
 
    }); 
 
} 
 

 
var products = [{ name: "Lenovo", price: "18000", model: "v580c" }, { name: "Apple", price: "30000", model: "Iphone 6" }, { name: "Nikon", price: "25000", model: "G290" }, { name: "Foo", price: "10", model: "a1" }, { name: "Foo", price: "20", model: "a2" }, { name: "Foo", price: "30", model: "a3" }, { name: "Foo", price: "40", model: "a4" }, { name: "Foo", price: "50", model: "a5" }, { name: "Foo", price: "60", model: "a6" }, { name: "Foo", price: "70", model: "a7" }, { name: "Foo", price: "80", model: "a8" }, { name: "Foo", price: "90", model: "a9" }]; 
 

 
console.log(filter(products, { name: 'Foo', price: { min: 60 } })); 
 
console.log(filter(products, { name: 'Foo', price: { max: 40 } })); 
 
console.log(filter(products, { name: 'Foo', price: { min: 40, max: 60 } })); 
 
console.log(filter(products, { name: 'Apple', price: { min: 3540, max: 60000 } })); 
 
console.log(filter(products, { name: 'Lenovo', price: { min: 3540, max: 60000 }, model: 'v580c' }));
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

我爲什麼沒有想到min'和'max'的'。 +1 – Rajesh

+0

只是一個建議,因爲你已經做出了一個非常通用的代碼,因此檢查'search [k] ==='object''最小/最大值看起來不正確。您可以檢查密鑰。 – Rajesh

+0

@Rajesh,這只是一個開放API的想法。它取決於用途,需要哪些參數,這是一個建議,而不是最終產品(如往常一樣:-)) –